今天我们来聊一聊如何定义一个宏来设置x二进制序列的第n个比特位为1或者0。
首先我们来实现设置第n个比特位为1,其他位置不变。
代码如下:
#define set_bit_to_one(x,n) (x|(1<<(n-1))) void show(int x) { int i = 0; for (i = 31; i >= 0; i--) { printf("%d ", (x >> i)&1); } printf("\n"); } int main() { int x = 0; set_bit_to_one(x, 10); show(x); return 0; }
但是,如果你 直接运行这样的一份代码,会得到下面的这个结果,显然,这个结果不是我们想要的,因为它并没有把第5个比特位的0改为1,那这是什么原因呢?
其实这个毛病也是很多C语言的新手的一个通病,我们知道,a=10,a+10的结果虽然是10,但是a依旧还是a,a本身的值并没有发生变化,而这里的按位或运算也一样,x |(1<<(n-1))并没有改变x的值,所以打印出来的x还是0,所以我们应该这样更改
修改前:
修改后:
#define set_bit_to_one(x,n) (x|=(1<<(n-1))) void show(int x) { int i = 0; for (i = 31; i >= 0; i--) { printf("%d ", (x >> i)&1);//打印每一个比特位的数据,0&1=0,1&1=1,所以&操作符不影响 //该位置原来的结果。 } printf("\n"); } int main() { int x = 0; set_bit_to_one(x, 5); show(x); return 0; }
设置第n个比特位为0,其他位置不变:
#define set_bit_to_zero(x,n) (x&=(~(1<<(n-1)))) void show(int x) { int i = 0; for (i = 31; i >= 0; i--) { printf("%d ", (x >> i)&1); } printf("\n"); } int main() { int x = -1; set_bit_to_zero(x, 5); show(x); return 0; }