C 按位和右移

C 按位和右移,c,bit,C,Bit,一个解决方案是 要检查位,请将数字x向右移动,然后按位将其删除: 位=(数字>>x)&1 这将把位x的值放入变量位 让我困惑的是,假设以下情况: unsigned number = 5; //0101 int x = 2; // 换班后(数字>>x)我们得到0001。但是我们移走了第1位和第2位,所以当我们进行按位和运算时,我们不是针对第三位而不是第二位进行运算吗,在第二位中,x=2?这是否意味着如果我想检查是否设置了位x,我不应该: bit = (number >> (x -

一个解决方案是

要检查位,请将数字x向右移动,然后按位将其删除:

位=(数字>>x)&1

这将把位x的值放入变量位

让我困惑的是,假设以下情况:

unsigned number = 5; //0101
int x = 2; //
换班后
(数字>>x)
我们得到
0001
。但是我们移走了第1位和第2位,所以当我们进行按位和运算时,我们不是针对第三位而不是第二位进行运算吗,在第二位中,
x=2
?这是否意味着如果我想检查是否设置了位
x
,我不应该:

 bit = (number >> (x - 1)) & 1);
bit = (number >> (x - 1)) & 1);

位数表示2的幂。因此,当
x
为2时,表示位2=2**2=4

最低有效位(或“最右边”位,如果您喜欢它,则为位0,而不是位1

此外,除非“位号”在变量中,否则没有理由实际执行位移位

例如,要测试值的第5位,只需执行以下操作

if (variable & 0x20)
    bit_is_set();

<代码>代码> 0x20仅为2 ** 5,(或1 是,您是按位和反对第三位的。考虑<代码> x <代码>为零索引,即第一位是位0。

您说:

在移位
(数字>>x)
之后,我们得到
0001
。但是我们移位了第1位和第2位,所以当我们按位和进行移位时,我们不是针对第三位而不是第二位进行移位吗,其中
x=2
?这难道不意味着如果我想检查位
x
是否已设置,我不应该:

 bit = (number >> (x - 1)) & 1);
bit = (number >> (x - 1)) & 1);
要获取第一个最低有效位的值,您需要
(数字>>0)&1

要获得第二个最低有效位的值,您需要
(数字>>1)&1

要获取第三个最低有效位的值,需要
(数字>>2)&1

等等

换句话说,

1st表示0位移位
第二个表示1位移位
3rd表示要移位2位
N表示要移位的N-1位


我希望这能让你更清楚一点。

我想我们是在对右边第三位进行比赛,因为我们拿下了2位,现在是第三位。“第n位”是(n+1)第1位。考虑不需要移位,因此当你移动N位时,你会检查位N + 0。我通常会说“位N”或“第N位从零开始计数”,希望避免混淆。好吧。我知道我们在<代码> Xi i:i=0</代码>开始了位索引。但是我不知道当我们说的时候。“检查第二位”在英语中,我们实际上是指检查位
x_2
,其中这是列表中的第三位对不起,还有一个问题:如果我试图检查寄存器中的某个位标志,文档上说,“检查是否为该功能设置了第五位”,我会执行
(功能>>5)&1
还是
(功能>>4)&1
?确切地说:第二位是第1位……这可能会更令人困惑,因为有些人从最高有效位到最低有效位进行编号,因为这是它们在图表上从左到右显示的方式。@8质子:检查是否为此功能设置了第五位:这样的措辞本质上是不精确的。请查看图表以了解第1位是如何显示的s是编号的,硬件人员通常从最重要到最不重要,以1为基础。这并不一致,“二的力量”这个词让人困惑吗?对于程序员来说?非常感谢。我基本上被这个小细节挂断了,因为我正试图检查某个CPU功能的寄存器(如果启用或不启用)。维基文档说,“如果支持,ECX寄存器的第30位被设置”。所以我不确定我应该做
(ECX>>30)&1
还是
(ECX>>29)&1
@8质子,我认为
((ECX>>29)&1
是正确的。我不好。我重新阅读了英特尔手册,它从第00位开始,因此第30位实际上是第31位,因此((ECX>>30)&1)会有用的!谢谢you@8protons,我很高兴你找到了解决办法。