【问题标题】:Bitmask and selecting even bits位掩码和选择偶数位
【发布时间】:2015-12-13 00:15:13
【问题描述】:

我正在读一本书,上面写着:

要选择 32 位无符号整数中的所有偶数位,我们可以将 位掩码为 0xAAAAAAAAAA 的数字,它是一个 32 位数字 偶数位设置(0xA 是十进制 10、1010 二进制)。用于选择奇数 我们可以与位掩码 0x5555555555 与位,这是一个与所有 偶数位设置(0x5 为十进制 5,0101 为二进制)

我不明白 0x 或 1010 如何将所有偶数位设置为 1。如果您从零开始从右到左,显然是奇数位被设置。我错过了什么?

【问题讨论】:

  • "如果你从左到右" 那是你的问题。数字从右侧开始,向左增加值。我可以在左边附加一个零,它可能是完全相同的数字。
  • 哎呀,这是一个错字。我的意思是从右到左。例如1010中最右边的位(index-0)是0(偶数),index-1位(奇数)是1,index-2位(偶数)是0。例如index-2位是偶数,它应该设置为 1,但它为零。这就是我的意思。
  • 这取决于您的观点,第一位(LSB)是数字0还是数字1?传统上它是 0,它非常适合 C 中从零开始的所有其他内容,但它与所有传统编号方式背道而驰。
  • 位 0 是最右边的位,或 LSb(注意:小“b”)。
  • 位从位 0 及以上枚举。它们不是从 1 起枚举的。所以你的书是不正确的,奇数需要 0xA 掩码,偶数需要 0x5 掩码。

标签: c bit-manipulation


【解决方案1】:

从左到右是你犯错的地方。

看看你实际做的时候会发生什么:

二进制 32 位:

your number: 1111 1111 1111 1111 1111 1111 1111 1111

Mask:        1010 1010 1010 1010 1010 1010 1010 1010

result:      1010 1010 1010 1010 1010 1010 1010 1010

第一位(从右边开始!!!)是奇数,当使用0xAAAAAAAAAA 作为位掩码使用AND 运算符时,不会被设置。只有偶数位会被设置。始终从最低有效位开始。

【讨论】:

  • 是的,我从 LSB 开始,只是我的 OP 中的一个错字(已修复)。我不确定您所说的“不均匀”和“过滤”是什么意思。右边的索引 2 设置为 0,而它应该是 1。
  • Fixed therms,不知道你说的索引错误是什么意思,它很好。
【解决方案2】:

您需要从右边 (LSB) 开始计算位的位置,作为第一位 (Odd) 和第二位 (Even)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-12
    • 2016-12-29
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多