【问题标题】:C# How to remove the n-th bit in integer?C#如何删除整数中的第n位?
【发布时间】:2019-05-10 15:54:34
【问题描述】:

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

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

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

问候, 托尼

【问题讨论】:

  • 你不能真正删除一点,你能做的就是把它变成 0。所以使用按位运算 01011 & 11011 = 01011 = 1011 = 00000000000000000000000000001011 (int32)。删除它的唯一方法是将它实际表示为一个字符串,然后任何转换回 int 只会使它再次具有 0。
  • @Mgetz 任务不是将某个位设置为零,而是将其完全删除。

标签: c# bit-manipulation


【解决方案1】:

没问题,把数字分解成“上半部分”和“下半部分”,把它们放在一起,中间的那个已经消失了。

未测试:

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,可能会有点奇怪
  • @Aravol 这就是我使用uint的原因
  • 感谢@harold,在我考虑到了类似的想法之后。现在我很高兴看到我的想法并不愚蠢:)
【解决方案2】:

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

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

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

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

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

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

有了这两个掩码,你可以如下构造结果:

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

Demo.

【讨论】:

  • 谢谢!我想到了类似的东西。
  • int input = int.Parse(Console.ReadLine()); int left = (input &gt;&gt; (n+1))&lt;&lt;(n+1); int right = (input &lt;&lt; (31-n))&gt;&gt;(31-n); int result = left | right;
  • 这将在 n=31 时失败,因为在 C#(和大多数 CPU)中移位计数是模 32。
【解决方案3】:

您可以使用以下方法:

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

希望对你有帮助!

【讨论】:

  • 这很酷,但想法是用位运算符解决它,而不是字符串。不过感谢您的提示!
【解决方案4】:
  int Place = 7;
  int TheInt = 182;

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

【讨论】:

  • 不要发布纯代码答案。请提供解释
  • 任务是在不使用字符串的情况下完成。只有位运算符。
  • @tony 您的问题中没有提到这些事情。如果是这样,它会节省我一些时间。
【解决方案5】:

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

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

这个想法是在n以下,位与零异或,保持不变,而从n及以上两个x异或相互抵消,留下x &gt;&gt; 1

【讨论】:

    【解决方案6】:
            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
    

    【讨论】:

    • 我编辑了代码,“int value = 27;string binary = Convert.ToString(value, 2);”也是做同样的事情。代码是将整数转换为二进制的不同方式。
    猜你喜欢
    • 1970-01-01
    • 2015-10-24
    • 2022-06-24
    • 2020-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-24
    • 1970-01-01
    相关资源
    最近更新 更多