我的问题很简单,但我找不到一个简单的解决方案:
我有一个更大的整数或eqal 16,所以二进制中至少1000
。我希望使用按位NOT运算符翻转第三位。在这种情况下,它将是1100
。
有没有可以做到这一点的运营商?据我所知,~
- 运算符会翻转所有位,而不仅仅是一位。
答案 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链接来进行位操作。