【问题标题】:Clear i to 0 bits清 i 为 0 位
【发布时间】:2017-08-13 05:05:12
【问题描述】:

我正在完成《Cracking the Coding Interview》,其中一种位操作技术如下:

要清除从 i 到 0(含)的所有位,我们取一个全为 1(即 -1)的序列并将其左移 i + 1 位。这给了我们一个 1 序列(在最高有效位中),然后是 i 0 位。

int clearBitsIthrough0(int num, int i){
    int mask = (-1 << (i + 1));
    return num & mask;
}

-1 怎么是全 1 的序列?

【问题讨论】:

  • 引用假定two's complement 表示
  • 考虑一下如果你增加“所有的”会发生什么。 x + 1 = 0 应该意味着x = -1

标签: bit-manipulation bits


【解决方案1】:

假设您使用的是 C/C++,int 表示一个有符号的 32 位整数,用 two's complement 表示。

-1 本身被假定为int 类型,因此等价于0xFFFFFFFF。推导如下:

10x00000001。反转位得到0xFFFFFFFE,加一个得到-1 的二进制补码表示:0xFFFFFFFF,一个由 32 个 1 组成的序列。

【讨论】:

  • 如果您不介意跟进:为什么将 1 添加到 i?我正在处理 i = 1 的简单情况,并且 1 位移位似乎是清除 1 位所需的全部内容,但这个公式会让你移位两个。
  • @EternalStudent 如果 i=1,目标是清除位 1 到 0。我猜 Gayle 正在对从 LSB(最低有效位)开始的位进行零索引。 -1 &lt;&lt; 2 会产生 30 个 1,然后是 2 个 0,当这两个 0 被“与”时,它们会清除 num 中的最低两位(1 到 0)。
猜你喜欢
  • 1970-01-01
  • 2012-11-11
  • 2023-03-17
  • 1970-01-01
  • 2012-05-26
  • 2011-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多