【问题标题】:Invert specific bits using bitwise NOT (no XOR)使用按位非(无异或)反转特定位
【发布时间】:2014-04-19 19:49:02
【问题描述】:

如何使用按位不反转 x 数的特定位?我知道我们可以使用 XOR 和掩码来做到这一点,但问题需要使用 NOT。

我需要从给定位置开始反转一组位。函数内部的变量包括原始值,要开始的位置和宽度=我要反转的位数。

我使用移位位从给定位置开始,但如何确保使用 NOT Bitwise 函数仅反转 x 位数?

【问题讨论】:

  • Bitwise NOT 采用单个参数并反转该参数的 所有 位。因此,无论“问题”需要什么,它都不是解决问题的合适方法。
  • 我在您的部分问题“使用按位不反转特定位”上运行了谷歌,第一个结果准确地说明了如何做到这一点。 en.wikipedia.org/wiki/Bitwise_operation

标签: c bit-manipulation


【解决方案1】:

异或的定义:a ^ b <--> (a & ~b) | (~a & b)

unsigned x = 0x0F;
unsigned mask = 0x44;  // Selected bits to invert

unsigned selected_x_bits_inverted = (x & ~mask) | (~x & mask);
printf("%02X\n", selected_x_bits_inverted);
// 4B

【讨论】:

    【解决方案2】:

    一种方法是:

    首先,将它们提取到y中:

    y = x & mask
    

    然后,反转 y 并仅获取您需要的位:

    y = ~y & mask
    

    清除从 x 中提取的位:

    x = x & (~mask)
    

    或这两个数字得到结果:

    x = x | y
    

    请注意,必须反转的每个位在掩码中都是 1。即使我使用了其他按位运算符,实际的位翻转也是由按位非完成的。另外,我认为不使用其他一些二元运算符是不可能达到这个结果的。

    【讨论】:

      【解决方案3】:

      此函数将从位置 'pos' 反转数字 'num' 的 'width' 位数

      int invert(int num, int pos, int width)
      {
      
        int mask = (~((~0) << width)) << pos;
        num = (~(num & mask)) & mask);
      
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-06-06
        • 1970-01-01
        • 2014-12-30
        • 1970-01-01
        • 2015-11-22
        • 2015-06-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多