C语言获取X的第Y位的二进制值,或者设置值

如:

#define GetBit(x,y) ((x) >> (y)&1)	//获取将x的第y位(0或1)
#define SetBit(x,y) x|=(1<<y) 		//将X的第Y位置1
#define ClrBit(x,y) x&=~(1<<y) 		//将X的第Y位清0

设置值解释(ChatGPT):

这段代码是对变量 x 进行右移 y 位操作,然后将结果和 1 进行按位与操作。它的含义是获取 x 的二进制表示中,从右往左数第 y 位的值,结果为 0 或 1。具体地,右移操作将 x 的二进制表示向右移动 y 位,将最右边的 y 位丢弃,然后将剩余的高位补 0。按位与操作将这个结果与二进制表示为 1 的数(只有最低位为 1,其他位都是 0)进行按位与操作,这样可以保留结果的最低位,其它位都被清零。这样得到的结果就是 x 的二进制表示中,从右往左数第 y 位的值。

举例:

1:

当 x = 210(二进制为 11010010),y = 4 时,((x) >> (y)&1) 的计算过程如下:

右移操作:将 x 的二进制表示向右移动 y=4 位,得到 00001101(二进制)。
按位与操作:将 00001101 和 00000001(二进制)进行按位与操作,得到 00000001(二进制)。
因此,((x) >> (y)&1) 的结果为 1。这表示 x 的二进制表示中,从右往左数第 y=4 位的值为 1。

2:

lemon233
那么Y为5呢
当 x = 210(二进制为 11010010),y = 5 时,((x) >> (y)&1) 的计算过程如下:

右移操作:将 x 的二进制表示向右移动 y=5 位,得到 00000110(二进制)。
按位与操作:将 00000110 和 00000001(二进制)进行按位与操作,得到 00000000(二进制)。
因此,((x) >> (y)&1) 的结果为 0。这表示 x 的二进制表示中,从右往左数第 y=5 位的值为 0。

再解释:

这段代码能够得到在 x 的二进制表示中,从右往左数第 y 位的值,是因为它将 x 进行了右移 y 位操作,这相当于将 x 的二进制表示从右往左数的第 y 位移到了最低位,然后将最低位和 1 进行按位与操作,相当于只保留最低位,其它位都被清零。

因为二进制数的每一位只有 0 和 1 两个值,因此最低位的值要么为 0,要么为 1。因此,将最低位和 1 进行按位与操作后,得到的结果要么为 0,要么为 1,这就是从右往左数第 y 位的值。

posted @ 2023-02-15 03:49  柠檬233  阅读(163)  评论(0编辑  收藏  举报