非常感谢帮助解释以下位操作 请原谅我对位算术缺乏了解。
int max = ~0;
int left = max - ((1 << j) - 1);
此操作的结果是什么?
(1 <&lt;(j-1))等于((1
答案 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中的未定义行为。更多详细信息可在以下链接中找到。
答案 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
个零的数字。你能猜出它们是否相似?