c - c中的变量按位运算

标签 c binary

我有一个变量列表,请注意每个变量只有一个 1二进制形式的不同位置:

int a = 0x00000001;
int b = 0x00000002;
int c = 0x00000004;
int d = 0x00000008;
int bounder = d;
int e = 0x00000010;
int f = 0x00000020;

新变量X可以设置为bitwise OR上面的任何变量如下:

int X = a | b | d | f;

我需要一个函数f检查给定的X(X >= bounder) ,是吗bitwise OR值<边界的变量。例如:

f(a|d) return true
f(a|b|c|e) return true
f(e|f) return false

我写:

bool f(int x) {
    return x << 29;
}

但是29是硬代码,如果我更改边界值,我也不会忘记更改29。我不确定这是跨平台的(int 二进制表示可能不同?)

我需要 f 来:

  1. 跑得快。
  2. 跨平台(Linux 和 Windows)。
  3. 边界值可以更改为另一个变量,例如 c 或 e...(运行时,至少是编译时)

最佳答案

要检查 x 中是否设置了小于 bounder 的任何位,请执行以下操作:

bool f(unsigned int x, unsigned int bounder)
{
    return ((x & (bounder - 1)) != 0);
}

-1 是关键,因为它会生成一个掩码,该掩码将所有需要检查的位设置为 1

关于c - c中的变量按位运算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35429395/

相关文章:

c - 标准 I/O scanf 的问题

c - C 中的 strcastr 是如何工作的。不断收到错误外部符号

python - 每 820 字节保存到新文件

c++ - 为什么我的函数代码中存在一个模棱两可的地方,即以十进制n的二进制表示形式计算1的数量

java - 确定数字是否为 2 的幂的最有效编程方法是什么?

c - gcc 编译与链接器 - 差异

c - 如何控制 apache c 模块中的连接

将数组转换为 int

c - 如何对实数进行二进制加法?

c - 为什么我无法正确打印二进制数?