理解位算术

时间:2017-03-02 16:23:15

标签: bit-manipulation bit

非常感谢帮助解释以下位操作 请原谅我对位算术缺乏了解。

int max = ~0;   
int left = max - ((1 << j) - 1); 

此操作的结果是什么?
(1 <&lt;(j-1))等于((1

2 个答案:

答案 0 :(得分:1)

遵循以下公式,

Case : 1
(1 << j) - 1) is equal to 2^j-1 [j = 1,2...]

Case : 2
(1<<(j-1)) is equal to 2^(j-1) [j = 1,2,3...]
  

(1 <(j-1))等于((1

,显然来自上述公式。

  

此操作的结果是什么?

对于这个问题,最大将是&#34; -1 &#34; [按位NOT(0)等于0]的所有位值的补码

然后公式将是 = - (2 ^ j)

如果 j = -1或j = 0 ,则上述公式无法按预期工作,因为 1&lt;&lt; -1 是C中的未定义行为。更多详细信息可在以下链接中找到。

https://stackoverflow.com/a/4945765/3979414

http://c0x.coding-guidelines.com/6.5.7.html

答案 1 :(得分:0)

(1 << j) - 1是一个右侧有j 一个位的数字

00...0011...11

max所有

的数字
11...1111...11

max中的每一位在从(1 << j) - 1中减去一位时将变为0,否则将保持为1。因此max - ((1 << j) - 1)将在右侧产生一个j为零的值

           j...210 <- bit position
    11...1111...11
 -  00...0011...11
__________________
    11...1100...00

这意味着结果是按位而不是(1 << j) - 1,即

max - ((1 << j) - 1) == ~((1 << j) - 1)
  

(1 <&lt;(j-1))等于((1

1 << (j-1)向左移动1个j-1个位置,因此右侧有j-1个零,后跟一个100...00。如上所述,(1 << j) - 1会在右侧给出一个j个零的数字。你能猜出它们是否相似?