gpt4 book ai didi

有人可以解释一下这个 bitMask 代码是如何工作的吗?

转载 作者:太空狗 更新时间:2023-10-29 15:35:03 25 4
gpt4 key购买 nike

这是我的合作伙伴想出的代码,但出于某种原因,我无法联系到他,问他应该如何工作。我现在已经经历了很多次,但似乎无法得到我应该得到的答案。

/**
* bitMask - Generate a mask consisting of all 1's
* lowbit and highbit
* Examples: bitMask(5,3) = 0x38
* Assume 0 <= lowbit <= 31, and 0 <= highbit <= 31
* If lowbit > highbit, then mask should be all 0's
* Legal ops: ! ~ & ^ | + << >>
*/
int bitMask(int highbit, int lowbit) {
int i = ~0;
return ~(i << highbit << 1) & (i << lowbit);
}

最佳答案

这个函数实际上是不正确的:对于 highbit 的大值和 lowbit ,它可能具有特定于实现的行为甚至未定义的行为。它应该使用并返回 unsigned类型:

unsigned bitMask(int highbit, int lowbit) {
unsigned i = ~0U;
return ~(i << highbit << 1) & (i << lowbit);
}

步骤如下:

  • i = ~0U;将 i 设置为所有位 1。

  • i << highbit将这些位向左移动,插入 highbit低位0位。

  • i << highbit << 1为多一个 0 位腾出空间。不应将此表达式简化为 i << (highbit + 1)因为如果highbit + 1,这样的位移是实现定义的变得大于或等于 i 类型中的位数.

  • ~(i << highbit << 1)补充这个面具,用 highbit + 1 创建一个面具低位设置位,高位设置为 0。

  • i << lowbit使用 lowbit 创建掩码0 位,高位 1。

  • ~(i << highbit << 1) & (i << lowbit)计算这 2 个掩码的交集,结果有 1 位来自位号 lowbit位编号 highbit包含在内,对来自 0 的位进行编号对于最不重要的。

例子:

  • bitMask(31, 0) -> 0xFFFFFFFF .
  • bitMask(0, 0) -> 0x00000001 .
  • bitMask(31, 16) -> 0xFFFF0000 .
  • bitMask(15, 0) -> 0x0000FFFF .

这种编号方法用于硬件规范。我个人更喜欢一种不同的方法,其中指定要跳过的位数和要设置的位数,更符合位域规范:

unsigned bitSpec(int start, int len) {
return (~0U >> (32 - len)) << start;
}

和相同的例子:

  • bitSpec(0, 32) -> 0xFFFFFFFF .
  • bitSpec(0, 1) -> 0x00000001 .
  • bitSpec(16, 16) -> 0xFFFF0000 .
  • bitSpec(0, 16) -> 0x0000FFFF .

关于有人可以解释一下这个 bitMask 代码是如何工作的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35109714/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com