C:按位不在某个位上

时间:2011-12-26 13:25:26

标签: c bitwise-operators

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

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

5 个答案:

答案 0 :(得分:10)

使用要翻转的位进行异或。

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

答案 1 :(得分:4)

待办事项

bit_fld ^= (1 << n)

其中bit_fld是位字段,第三位n = 3.

答案 2 :(得分: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。

答案 3 :(得分:2)

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

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

答案 4 :(得分:1)

#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
*/

我在c中引用this链接来进行位操作。