【发布时间】:2020-09-12 20:09:07
【问题描述】:
给定一个设置了一个且只有一个位 (n) 的 uint16,我想测试 bit_rank 是否设置了所有更重要的位。我目前正在使用 for 循环,但我敢肯定只有几个运算符有点巧妙。此代码使用编译器,其中位操作生成 32 位 int。
uint16_t b; // loop variable
uint16_t n; // one and only one bit set
uint16_t bit_rank; // contains n and possibly higher/lower bits than n
for (b = n << 1; b < 0x10000; b <<= 1)
if (b & bit_rank)
continue;
else
break;
if (b == 0x10000)
printf("all bits from n to 0x8000 are set");
【问题讨论】:
-
有效吗?最后一个比较
(b == 0x10000)对我来说似乎有点可疑......(双关语不是故意的) -
不确定是否完全了解您想要什么,但
if (n & bit_rank == n)不是您需要的吗? -
您可以添加具有预期输出的数据样本吗?
-
这样做不会测试是否设置了位列中比 n 更多的有效位,它只会测试位列中的第 n 位是否设置
-
如果 b 是 uint16_t 则
b < 0x10000将始终为真,b == 0x10000始终为假
标签: c bit-manipulation