我正在尝试分配:“在不使用sizeof()函数的情况下查找无符号整数数据类型中的位数。”
我的设计是将整数转换为位然后计算它们。例如:10 is 1010
和5 is 101
Converting integer to a bit representation显示如下:
do
{
Vec.push_back( x & 1 )
}
while ( x >>= 1 );
我不想只是复制粘贴的东西。当我使用F-10时,我看到(x & 1)
正在做什么,但我不知道它是名字还是它如何完成它的工作(比较一些东西?)。我也知道>=
“大于或等于”但x >>= 1
是什么?
注意:标记的副本是JavaScript而不是C ++
这些是按位运算符(reference)。
x & 1
产生的值为1
或0
,取决于x
的最低位:如果最后一位是1
,x & 1
的结果是1
;否则,它是0
。这是一个按位AND操作。
x >>= 1
的意思是“将x
设置为向右移动一位”。该表达式在移位后评估x
的新值。
注意:对于无符号类型的值,移位后最高有效位的值为零。对于有符号类型的值,最高有效位是作为符号扩展的一部分从移位之前的值的符号位复制的,因此如果x
是有符号类型,则循环将永远不会完成,并且初始值为负。
x & 1
相当于x % 2
。
x >> 1
相当于x / 2
所以,这些东西基本上是结果,剩下的除以二。
除了“dasblinkenlight”的答案,我认为一个例子可以帮助。我只会使用8位来更好地理解。
x & 1
产生的值为1
或0
,取决于x
的最低位:如果最后一位是1
,x & 1
的结果是1
;否则,它是0
。这是一个按位AND操作。
这是因为1
将以00000001
的比特表示。只有最后一位设置为1
。让我们假设x
是185
,它将以10111001
的比特表示。如果你使用x
在1
上应用按位AND运算,结果将是:
00000001
10111001
--------
00000001
操作结果的前七位将是操作后的0
,在这种情况下将不携带任何信息(参见Logical AND operation)。因为无论操作数x
的前7位是什么,在操作之后它们将是0
。但操作数1
的最后一位是1
,它将揭示操作数x
的最后一位是0
还是1
。所以在这个例子中,按位AND运算的结果将是1
,因为我们的最后一点x
是1
。如果最后一位是0
,那么结果也是0
,表明操作数x
的最后一位是0
:
00000001
10111000
--------
00000000
x >>= 1
的意思是“将x
设置为向右移动一位”。该表达式在移位后评估x
的新值
我们从上面选择一个例子。对于x >>= 1
,这将是:
10111001
--------
01011100
对于左移x <<= 1
,它将是:
10111001
--------
01110010
请注意用户“dasblinkenlight”关于班次的说明。
它类似于x = (x >> 1)
。
(operand1)(operator)=(operand2) implies(=>) (operand1)=(operand1)(operator)(operand2)
它将x的二进制值向右移动一位。
EG
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)
x&1产生的值为1或0,具体取决于x的最低有效位:如果最后一位为1,则x&1的结果为1;否则,它为0.这是一个按位AND操作。
x >> = 1表示“将x设置为自身向右移动一位”。表达式计算移位后x的新值。
注意:对于无符号类型的值,移位后最高有效位的值为零。对于有符号类型的值,最高有效位是作为符号扩展的一部分从移位之前的值的符号位复制的,因此如果x是有符号类型,则循环将永远不会完成,并且初始值为负。