今天我们来聊一聊如何定义一个宏来设置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;
}
你学会了吗??