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



我发现这段代码(没有双关语(解决了我需要解决的问题,但我真的不明白(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
}
}
}

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

这是非常"通常的"。 它测试是否设置了第ji。 另一种方式是if ((i >> j) & 1)

如果您希望它是自我记录的,请编写一个名称很好的帮助程序函数:

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

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

正如Voigt先生所指出的,表达式i & (1 << j)只是检查j-th位是否在i变量中设置。这是在 C 语言中做事的一种非常标准的方式。

要提高可读性,您可以这样做:

// Return value with n-th bit set to 1
int bit(int n) { return 1 << n; }
...
for (j = 0; j < n; j++)
{
if (i & bit(j))
{
//print something
}
}

另一种方法是将表达式"隐藏"在具有有意义名称的函数中:

bool is_bit_set_in(int var, int n) { return var & (1 << n); }
...
for (j = 0; j < n; j++)
{
if (is_bit_set_in(i, j))
{
//print something
}
}

相关内容

最新更新