c - 是否有更简单、更少机器级的表达方式或与 (i & (1 << j)) 相同的方式?

标签 c bitwise-operators bit-shift

我发现这段代码(没有双关语意)解决了我需要解决的问题,但我并不真正理解 (i & (1 << j)) 部分的作用。是否有更“高级”的编写方式以便我理解?还是用不那么“纯粹”的不同方式做同样的事情?


//this is not the actual code, just bits of it so you have an idea of how the variables are used

for (i = 0; i < vectorsize; i++) {
void findsubsets(unsigned int *value, int n, int i)
}

void findsubsets {
     for (j = 0; j < n; j++) {
        if (i & (1 << j)) {
            //print something
        }
    }
}

我想要该声明的替代方案,它做同样的事情(或者更确切地说,解决同样的问题)但更“平常”。我当然只是指按位移位。

最佳答案

那是很“平常”的。它测试 i 的第 j 位是否已设置。另一种方法是 if ((i >> j) & 1)

如果你希望它是 self 记录的,写一个很好命名的辅助函数:

bool jth_bit(int i, int j) { return (i >> j) & 1; }

(根据您使用的 C 版本,您可能需要 _Bool 而不是 bool)

关于c - 是否有更简单、更少机器级的表达方式或与 (i & (1 << j)) 相同的方式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57916116/

相关文章:

c - 存储在 EEPROM 中的数据结构的卷影副本

c - fork() 的异步信号安全

c - 这行代码是什么意思(按位运算符)

c# - 按位比较两个枚举以获得单个 True 结果?

c++ - 通过左移,可以将1设置为零

c - 如何将 SIMD int vector 转换为在 GCC 中 float ?

c - 在C中实现Linkedlist时,head没有被设置为NULL

arrays - 在 Verilog 中移动 2D 数组

c - 为什么这个带有按位运算符的语句与这个 if 语句相同?

assembly - 旋转指令(x86 上的 ROL、RCL)的用途是什么?