代码之家  ›  专栏  ›  技术社区  ›  Matt Jacobsen

在C中反转1位#

  •  18
  • Matt Jacobsen  · 技术社区  · 14 年前

    我有一点A byte (总是在最低的位置)我想反转。 如果给定00000001,我想得到00000000,如果给定00000000,我想得到00000001。

    我是这样解决的:

    bit > 0 ? 0 : 1;
    

    我很好奇还能怎么做。

    2 回复  |  直到 9 年前
        1
  •  41
  •   Lasse V. Karlsen    14 年前

    怎么样:

    bit ^= 1;
    

    这只是XOR的第一个1位,它切换它。

    如果要翻转位n,从右边的0向左边的7计数(对于一个字节),可以使用以下表达式:

    bit ^= (1 << N);
    

    这不会干扰任何其他位,但如果该值在十进制值中仅为0或1(即所有其他位都为0),则也可以使用以下值:

    bit = 1 - bit;
    

    同样,如果只有一个位集,您可以使用与第一个翻转位n相同的1值:

    bit = (1 << N) - bit;
    

    当然,在这一点上,你实际上并不是在做同样意义上的位操作。

    您拥有的表达式也很好,但会再次操纵整个值。

    另外,如果你表达了一点作为 bool 值,可以这样做:

    bit = !bit;
    

    它切换值。


    更多的笑话 : 当然,“企业”的方法是使用查阅表格:

    byte[] bitTranslations = new byte[256];
    bitTranslations[0] = 1;
    bitTranslations[1] = 0;
    
    bit = bitTranslations[bit];
    
        2
  •  4
  •   Uwe Keim Tomasz    9 年前

    您的解决方案不正确,因为如果bit==2(10),那么您的分配将产生bit==0(00)。

    这就是你想要的:

    bit ^= 1;