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

时间:2015-02-27 17:51:19

标签: c# bit-manipulation

我正试图找到一种从整数中删除一个位的方法。解决方案不得使用字符串操作。 例如,我的数字为27,二进制为1 1 011。 我想删除第三位,所以它留给我1011。 或者我们有182(10110110),删除第6位,结果是1110110(即118)。我想到算法怎么做,但到目前为止没有运气,我在互联网上找不到有用的信息。

我知道如何使用按位运算符以及如何提取或操作整数位(更改值,交换值等),但我不知道如何“删除”某个位。

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

此致 托尼

6 个答案:

答案 0 :(得分:8)

没问题,只需将数字分解为"上部"和#34;下部",把它们放在一起,没有现在消失的中间位。

未经测试:

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;

答案 1 :(得分:1)

为了做到这一点,你需要两个位掩码和一个班次。

第一位掩码为您提供位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

手中有两个掩码,您可以按如下方式构建结果:

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

Demo.

答案 2 :(得分:0)

您可以使用以下方法:

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);

希望它有所帮助!

答案 3 :(得分:0)

  int Place = 7;
  int TheInt = 182;

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

答案 4 :(得分:0)

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

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

我们的想法是,在n下方,位为零,保持不变,而从n和上方两个x xored相互抵消,留下x >> 1。< / p>

答案 5 :(得分:0)

        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