C中数字的二进制表示

Zac*_*112 6 c bitwise-operators

我遇到了这个代码,用于表示数字的二进制表示.我想知道使用的必要性!! 在代码中.

int main() {
    int n,i;
    unsigned flag = 1<<(sizeof(int) * 8 - 1);     

    printf("Input the number\n");
    scanf("%d",&n);     
    for(i=0;i<sizeof(int)*8;i++) {    
            printf("%d",!!(n & flag) );    
            n = n << 1;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

Max*_*keh 10

!! 将任何非零值转换为1,并将零值保留为零.

x = 0;
y = 50;
!x; // 1
!y; // 0
!!x; // 0
!!y; // 1
Run Code Online (Sandbox Code Playgroud)

这是一个穷人的布尔演员.

  • @TJ Crowder:No.逻辑运算符保证计算为0或1.具体来说:"如果操作数的值不等于0,则逻辑否定的结果为0;如果其操作数的值比较等于0,则为1. " (C99标准的6.5.3.3/5) (2认同)

cod*_*ict 7

使用的标志只有MSB设置,所有其他位清零,因此当你bitwise and使用数字时,你可以测试数字中的MSB.

按位和结果有两种结果:

  • 零 - 表示数字在其MSB中为0.
  • 非零 - 表示该数字在其MSB中为1.

现在我们需要一种映射方式

Non-zero -> 1
Zero -> 0
Run Code Online (Sandbox Code Playgroud)

所以我们使用双重否定.

可以使用以下方法完成同样的事情:

for(i=0;i<sizeof(int)*8;i++) {

    (n & flag) ? printf("1"):printf("0");
    n = n << 1;
}
Run Code Online (Sandbox Code Playgroud)

  • MSB =最重要的位 (2认同)