C# 如何删除整数中的第 n 位?

C# How to remove the n-th bit in integer?

我正在尝试找到一种从整数中删除一位的方法。该解决方案不得使用字符串操作。 例如,我有数字 27,二进制为 11011。 我想删除第三位,这样我就剩下 1011。 或者我们有 182 (10110110),删除第 6 位,结果是 1110110(即 118)。我正在尝试考虑算法如何做到这一点,但到目前为止运气不佳,而且我无法在互联网上找到有用的信息。

我知道如何使用按位运算符以及如何提取或操作整数中的位(更改值、交换值等),但我不知道如何 'remove' 某个位。

我不是在寻找代码,只是在寻找操作逻辑。如果有人能帮助我,那就太棒了!

此致, 托尼

没问题,把数字分解成"upper part"和"lower part",然后把它们放在一起,去掉现在消失的中间位

未测试:

uint upper = x & 0xFFFFFFF0;
uint lower = x & 7;
return (upper >> 1) | lower;

更普遍:(也未测试)

uint upper = x & (0xFFFFFFFE << n);
uint lower = x & ((1u << n) - 1);
return (upper >> 1) | lower;

为此,您需要两个位掩码和一个移位。

第一个位掩码为您提供第 n 位以上的数字部分,不包括第 n 位。掩码构造如下:

var top = ~((1U<<(n+1))-1); // 1111 1111 1000 000, 0xFF80

第二个位掩码为您提供 n 位以下的数字部分,不包括第 n 位:

var bottom = (1U<<n)-1;     // 0000 0000 0011 1111, 0x003F

上面的评论显示了第二个示例的值(即 n == 6

有了这两个mask,就可以构造出如下结果:

var res = ((original & top)>>1) | (original & bottom);

Demo.

您可以使用以下方法:

int value = 27;
string binary = Convert.ToString(value, 2);
binary = binary.Remove(binary.Length-3-1,1);  //Remove the exact bit, 3rd in this case
int newValue = Convert.ToInt32(binary, 2);
Console.WriteLine(newValue);

希望对您有所帮助!

  int Place = 7;
  int TheInt = 182;

  string binary = Convert.ToString(TheInt, 2);
  MessageBox.Show(binary.Remove(binary.Length - Place, 1));

这里是一个比 harold 的解决方案需要更少操作的版本:

x ^ (((x >> 1) ^ x) & (0xffffffff << n));

想法是,在 n 以下,位与零进行异或,保持不变,而在 n 及以上,两个 x 异或相互抵消,留下 x >> 1 .

        int a = 27;//int= 4byte equal to 32 bit
        string binary = "";
        for (int i = 0; i < 32; i++)
        {             
            if ((a&1)==0)//if a's least significant bit is 0 ,add 0 to str
            {
                binary = "0" + binary;
            }
            else//if a's least significant bit is 1 ,add 1 to str
            {
                binary = "1" + binary;
            }
            a = a >> 1;//shift the bits left to right and delete lsb
            //we are doing it for 32 times because integer have 32 bit.
        }
        Console.WriteLine("Integer to Binary= "+binary);

     //Now you can operate the string(binary) however you want.

      binary = binary.Remove(binary.Length-4,1);//remove 4st bit from str