C:一个数字前面的&符号

lam*_*mba -1 c

这行(x = n&5;)在下面的代码中是什么意思?据我所知,&符用于指针.我不希望编译这个代码,但它编译并运行良好.我得到的结果是

0,1,0,1,4,5,4,5,0,1,

#include <stdio.h>

int main(void){
    int x, n;
    for (n = 0; n < 10; n++){
        x = n & 5;
        printf("%d,", x);
    }
    printf("\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Tim*_*nes 5

在这种情况下,它是按位AND.

x = n & 5;
Run Code Online (Sandbox Code Playgroud)

将AND 5(即0b101)与任何内容相符n.

AND处理表示值的位.如果两个值在该位置都为1,则结果为1,否则为0.

由于我们与5进行AND运算,并且只有4个值可以用0b101中的两个位进行,因此x的唯一可能值是1,4,5和0.这是一个例子:

n           &    5     = x
1 (0b0001)  &  0b0101  = 1  (0b0001)
2 (0b0010)  &  0b0101  = 0  (0b0000)
3 (0b0011)  &  0b0101  = 1  (0b0001)
4 (0b0100)  &  0b0101  = 4  (0b0100)
5 (0b0101)  &  0b0101  = 5  (0b0101)
6 (0b0110)  &  0b0101  = 4  (0b0100)
7 (0b0111)  &  0b0101  = 4  (0b0100)
8 (0b1000)  &  0b0101  = 0  (0b0000)
9 (0b1001)  &  0b0101  = 1  (0b0001)
Run Code Online (Sandbox Code Playgroud)


Moo*_*uck 5

那就是“按位与”运算符。通常,它使用两个整数,并返回一个仅包含两个参数中都设置了位的整数。

base10 base2
6       0110
3       0011
6&3     0010   (=2)
Run Code Online (Sandbox Code Playgroud)

还有一个“按位或” |设置任何一个已设置的位。

base10 base2
6       0110
3       0011
6|3     0111   (=7)
Run Code Online (Sandbox Code Playgroud)

还有“按位异或” ^设置不同的位。

base10 base2
6       0110
3       0011
6^3     0101   (=5)
Run Code Online (Sandbox Code Playgroud)