【问题标题】:C: Bitwise NOT on certain bitC:在某个位上按位非
【发布时间】:2012-01-28 00:01:35
【问题描述】:

我的问题很简单,但我找不到简单的解决方案: 我有一个大于或等于 16 的整数,所以至少 1000 是二进制的。我希望使用按位 NOT 运算符翻转第三位。在这种情况下,它将是1100

有没有运营商可以做到这一点?据我所知,~-operator 会翻转所有位,而不仅仅是某个位。

【问题讨论】:

  • 如果这是作业,请标记它。
  • 抱歉,这不是功课,纯属好奇

标签: c bitwise-operators


【解决方案1】:

与要翻转的位进行异或。

int c = 0x10; // 10000b
int m = 0x08; // 01000b
c ^= m;       // 11000b

【讨论】:

  • @larsmans 谢谢!我在所有三个上都“放弃”了最后一个零。现在已修复。
  • 其实我应该早点考虑异或。很抱歉这么专注于 NOT
【解决方案2】:

bit_fld ^= (1 << n)

其中 bit_fld 是位字段,n=3 表示第三位。

【讨论】:

    【解决方案3】:

    现在您所说的“翻转”实际上称为 XOR。 C(++) 中的 XOR 工作方式如下:

    int sixteen = 16; // 10000
    int twentyfour = sixteen ^ 0x8; // flip the 4th bit. result: 24
    int sixteen_again = twentyfour ^ 0x8; // again, flip the 4th bit. result: 16
    

    附带说明:二进制中的 16 是 10000,而不是 1000。

    【讨论】:

      【解决方案4】:

      查看此网站:http://www.daniweb.com/software-development/c/threads/41493 他和你有同样的问题,还有几个解决办法!

      void flipbit(unsigned* a, unsigned b)
      {
          *a ^= (1 << b);
      }
      

      【讨论】:

        【解决方案5】:
        #include <stdio.h>
        
        int main(void)
        {
            int x = 0xFFFFFFFF;
            int n = 0;
            int y, i;
        
            for (i=0 ; i < (int)sizeof(int)*8 ; i++) {
                y = x ^ ~(1<<i);
                printf("x=%x\ti=%d\ty=%x\n", x, i, y);
            }
        
            x = 0x0;
            for (i=0 ; i < (int)sizeof(int)*8 ; i++) {
                y = x ^ ~(1<<i);
                printf("x=%x\ti=%d\ty=%x\n", x, i, y);
            }
            return 0;
        }
        
        /*
        Output:
        x=ffffffff  i=0 y=1
        x=ffffffff  i=1 y=2
        x=ffffffff  i=2 y=4
        x=ffffffff  i=3 y=8
        x=ffffffff  i=4 y=10
        x=ffffffff  i=5 y=20
        x=ffffffff  i=6 y=40
        x=ffffffff  i=7 y=80
        x=ffffffff  i=8 y=100
        x=ffffffff  i=9 y=200
        x=ffffffff  i=10    y=400
        x=ffffffff  i=11    y=800
        x=ffffffff  i=12    y=1000
        x=ffffffff  i=13    y=2000
        x=ffffffff  i=14    y=4000
        x=ffffffff  i=15    y=8000
        x=ffffffff  i=16    y=10000
        x=ffffffff  i=17    y=20000
        x=ffffffff  i=18    y=40000
        x=ffffffff  i=19    y=80000
        x=ffffffff  i=20    y=100000
        x=ffffffff  i=21    y=200000
        x=ffffffff  i=22    y=400000
        x=ffffffff  i=23    y=800000
        x=ffffffff  i=24    y=1000000
        x=ffffffff  i=25    y=2000000
        x=ffffffff  i=26    y=4000000
        x=ffffffff  i=27    y=8000000
        x=ffffffff  i=28    y=10000000
        x=ffffffff  i=29    y=20000000
        x=ffffffff  i=30    y=40000000
        x=ffffffff  i=31    y=80000000
        x=0 i=0 y=fffffffe
        x=0 i=1 y=fffffffd
        x=0 i=2 y=fffffffb
        x=0 i=3 y=fffffff7
        x=0 i=4 y=ffffffef
        x=0 i=5 y=ffffffdf
        x=0 i=6 y=ffffffbf
        x=0 i=7 y=ffffff7f
        x=0 i=8 y=fffffeff
        x=0 i=9 y=fffffdff
        x=0 i=10    y=fffffbff
        x=0 i=11    y=fffff7ff
        x=0 i=12    y=ffffefff
        x=0 i=13    y=ffffdfff
        x=0 i=14    y=ffffbfff
        x=0 i=15    y=ffff7fff
        x=0 i=16    y=fffeffff
        x=0 i=17    y=fffdffff
        x=0 i=18    y=fffbffff
        x=0 i=19    y=fff7ffff
        x=0 i=20    y=ffefffff
        x=0 i=21    y=ffdfffff
        x=0 i=22    y=ffbfffff
        x=0 i=23    y=ff7fffff
        x=0 i=24    y=feffffff
        x=0 i=25    y=fdffffff
        x=0 i=26    y=fbffffff
        x=0 i=27    y=f7ffffff
        x=0 i=28    y=efffffff
        x=0 i=29    y=dfffffff
        x=0 i=30    y=bfffffff
        x=0 i=31    y=7fffffff
        */
        

        我参考this 链接以进行c 中的位操作。

        【讨论】:

        • 感谢您关注我!我已经纠正了错误!每当我出错时请继续纠正我! :)
        猜你喜欢
        • 1970-01-01
        • 2011-04-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-22
        • 1970-01-01
        • 2021-09-25
        • 1970-01-01
        相关资源
        最近更新 更多