我试图做分配:"找到一个无符号整数数据类型的位数,而不使用sizeof()函数。"
我的设计是将整数转换成位,然后计数。例如:10 is 1010
和5 is 101
将整数转换为位表示,如下所示:
do
{
Vec.push_back( x & 1 )
}
while ( x >>= 1 );
我不想只是复制粘贴的东西。当我使用F-10时,我看到(x & 1)
在做什么,但我不知道它的名字或它是如何工作的(比较什么?)我也知道>=
哪个"大于或等于",但x >>= 1
是什么?
注意:标记的副本是JavaScript而不是c++
这些是位运算符(参考)。
x & 1
根据x
的最低有效位产生1
或0
的值:如果最后一位是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
。我们假设x
是185
,用比特表示为10111001
。如果你用1
对x
进行位与操作,结果如下:
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位"。的表达式在shiftx
的新值。
让我们选择上面的例子。对于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)。
-
如果'n'是奇数(n &1)将返回true/1;
-
否则返回false/0;
(n>>=1)中的'>>'是一个位操作符,称为'右移',该操作符将修改'n'的值,公式为:
(n >>= m) => (n = n>>m) => (n = n/2^m)
请阅读GeeksforGeek关于"按位运算符"的文章,推荐!