什么是(x&1)和(x >>= 1)?



我试图做分配:"找到一个无符号整数数据类型的位数,而不使用sizeof()函数。"

我的设计是将整数转换成位,然后计数。例如:10 is 10105 is 101

将整数转换为位表示,如下所示:

do
{ 
    Vec.push_back( x & 1 ) 
} 
while ( x >>= 1 );

我不想只是复制粘贴的东西。当我使用F-10时,我看到(x & 1)在做什么,但我不知道它的名字或它是如何工作的(比较什么?)我也知道>=哪个"大于或等于",但x >>= 1是什么?

注意:标记的副本是JavaScript而不是c++

这些是位运算符(参考)。

x & 1根据x的最低有效位产生10的值:如果最后一位是1,则x & 1的结果是1;否则为0。这是位与操作

x >>= 1表示"设置x为自身右移1位"。该表达式计算为移位后的x的新值。

注意:对于unsigned类型的值,移位后的最高位为0。对于有符号类型的值,作为符号扩展的一部分,在移位之前从值的符号位复制最高有效位,因此如果x是有符号类型且初始值为负,则循环将永远不会结束。

x & 1等价于x % 2

x >> 1等价于x / 2

这些基本上就是除以2的结果和余数

除了"dasblinkenlight"的答案外,我认为一个例子可能会有所帮助。为了更好地理解,我只使用8位。

x & 1产生的值要么是1,要么是0,取决于最小值x的有效位:如果最后一位为1,则x & 1的结果为1;否则为0。这是位与操作

这是因为1将以位表示为00000001。只有最后一位被设置为1。我们假设x185,用比特表示为10111001。如果你用1x进行位与操作,结果如下:

00000001
10111001
--------
00000001

操作结果的前7位将在操作后为0,在这种情况下不携带任何信息(参见逻辑与操作)。因为无论操作数x的前7位之前是什么,操作后它们都将是0。但是操作数1的最后一位是1,它将显示操作数x的最后一位是0还是1。所以在这个例子中,按位与运算的结果将是1,因为x的最后一位是1。如果最后一位是0,那么结果也是0,这表明操作数x的最后一位是0:

00000001
10111000
--------
00000000

x >>= 1表示"设置x为自身右移1位"。的表达式在shift

之后计算为x的新值。

让我们选择上面的例子。对于x >>= 1,这将是:

10111001
--------
01011100

对于左移x <<= 1,它将是:

10111001
--------
01110010

请注意用户"dasblinkenlight"关于班次的说明

x = (x >> 1)相似。

(operand1)(operator)=(operand2)  implies(=>)  (operand1)=(operand1)(operator)(operand2) 

将x的二进制值向右移动1。

int x=3;    // binary form (011) 
x = x >> 1; // zero shifted in from the left, 1 shifted out to the right:
            // x=1, binary form (001)

(n &1)将检查'n'是奇数还是偶数,这类似于(n%2)。

  1. 如果'n'是奇数(n &1)将返回true/1;

  2. 否则返回false/0;


(n>>=1)中的'>>'是一个位操作符,称为'右移',该操作符将修改'n'的值,公式为:

(n >>= m) => (n = n>>m) => (n = n/2^m)

请阅读GeeksforGeek关于"按位运算符"的文章,推荐!

相关内容

  • 没有找到相关文章

最新更新