C 按位和右移
一个解决方案是 要检查位,请将数字x向右移动,然后按位将其删除: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)&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,我很高兴你找到了解决办法。