BSa*_*ita 0 c bit-manipulation
给定一个只有一位设置 (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");
Run Code Online (Sandbox Code Playgroud)
如果无符号值 b 恰好设置了一位,则将 b 与相同类型的某个无符号值 x 相加,并将结果强制转换或强制转换为该类型(如果小于“int”)将产生至少等于 b 的值,如果 b 或任何更高位被清除,如果 b 和所有更高位都已设置,则小于 b。
请注意,如果 b 和 x 的类型小于“无符号”,则在“所有高位集”情况下将 b 添加到 x 将产生太大而无法适应 b 和 x 类型的结果。将结果强制转换或强制转换为较小的类型会产生小于 b 的值,否则结果会更大。