我正在尝试进行分配:“在不使用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 ++
答案 0 :(得分:31)
这些是按位运算符(reference)。
x & 1
生成的值为1
或0
,具体取决于x
的最低有效位:如果最后一位为1
, x & 1
的结果是1
;否则,它是0
。这是一个按位AND操作。
x >>= 1
表示"将x
设置为自身向右移动一位"。表达式在移位后评估x
的新值。
注意:对于无符号类型的值,移位后最高有效位的值为零。对于有符号类型的值,最高有效位是作为符号扩展的一部分移位之前从值的符号位复制的,因此如果x
是有符号类型,则循环将永远不会完成,初始值为负。
答案 1 :(得分:15)
x & 1
相当于x % 2
。
x >> 1
相当于x / 2
所以,这些事情基本上是结果,剩下的除以二。
答案 2 :(得分:10)
除了#34; 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
的前七位是在之前,操作之后它们将是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
请注意用户的注意事项&#34; dasblinkenlight&#34;关于轮班。
答案 3 :(得分:2)
类似于x = (x >> 1)
。
(operand1)(operator)=(operand2) implies(=>) (operand1)=(operand1)(operator)(operand2)
它将x的二进制值向右移动一次。
E.g。
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)
答案 4 :(得分:1)
x&1 产生的值是1或0,具体取决于x的最低有效位:如果最后一位为1,则x&1的结果为1;否则,x为1。否则为0。这是按位与运算。
x >> = 1 的意思是“ 将x自身设置为向右偏移一位”。移位后,该表达式将求值为x的新值。
注:对于无符号类型的值,移位后最高有效位的值为零。对于有符号类型的值,最高有效位是从移位之前的值的符号位复制而来的,这是符号扩展的一部分,因此,如果x是有符号类型且初始值为负,则循环永远不会结束。 / p>
答案 5 :(得分:0)
(n&1)将检查'n'是奇数还是偶数,类似于(n%2)。
如果'n'为奇数(n&1)将返回true / 1;
否则它将返回false / 0;
(n >> = 1)中的'>>'是按位运算符,称为“右移”,该运算符将修改'n'的值,公式为:
(n >>= m) => (n = n>>m) => (n = n/2^m)
阅读GeeksforGeek关于“按位运算符”的文章,推荐!