始终在<<之间混淆和>>

时间:2012-09-27 08:23:05

标签: bit-manipulation

我总是在这两个操作员之间感到困惑,我不知道是什么造成的 数字越来越低。

有人可以告诉我如何记住每个运营商的行为吗? (迹象,一些例子等)

5 个答案:

答案 0 :(得分:1)

将它们视为向上或向下“推”位的箭头。

<<运算符将通过将位向上推向一个字节中的较高值插槽来增加数字的大小,例如:

128  64  32  16  8   4   2   1
-------------------------------
 0   0   0   0   0   1   0   0    before push (value = 4)
 0   0   0   0   1   0   0   0    after << push (value = 8)

>>运算符将通过将位向下推向字节中的较低值插槽来减小数字的大小,例如:

128  64  32  16  8   4   2   1
-------------------------------
 0   0   0   0   0   1   0   0    before push (value = 4)
 0   0   0   0   0   0   1   0    after >> push (value = 2)

答案 1 :(得分:1)

您无法将它们视为使数字变大或变小。根据输入的不同,这两种移位都可以使数字变大或变小。

  • 左移(无符号解释):0位可以从左侧掉落,使数字变大,或者1位可以从左侧掉落,使数字变小。
  • 左移(带符号解释):0位可以移入先前为0的符号,使数字更大; 0位可以移入先前为1的符号,使数字更大; 1位可以移入之前为1的符号,使数字变小; 1位可以移入之前为0的符号,使数字更小。
  • 无符号右移:好的,这个很简单,数字变小了。
  • 签名右移:负数变大,正数变小。

我为左移而不是右移写“解释”的原因是只有一种左移,但是根据你是否将结果解释为有符号或无符号,它有一个“不同”的结果(当然,这些位是相同的)。但实际上有两种不同的右移,一种保持符号,无符号右移只是一个0位移位(也有一个符号解释,但通常不重要)。

答案 2 :(得分:0)

以二进制方式工作,方向与十进制方向相同。左移(1,10,100,......)使数字变大。向右移动会使数字变小。

答案 3 :(得分:0)

&LT;&LT;是左移算子。例如0b10&lt;&lt; 2 = 0b1000(由0b语法组成)。 &GT;&GT;是正确的转变运营商,它恰恰相反。 0b10&gt;&gt; 1 = 0b1。签名号码右移不会改变标志。对于签名左移,您必须了解2's complement以了解正在发生的事情。

答案 4 :(得分:0)

<< --- it tells going left direction and this means left side decreasing.

>> --- it tells going right direction and this means right side decreasing.