在C语言中对数字进行二进制表示

6

我看到了一个用于数字二进制表示的代码。我想知道在代码中使用 !! 的原因。

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;
}
3个回答

10

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

x = 0;
y = 50;
!x; // 1
!y; // 0
!!x; // 0
!!y; // 1

这是一种简单的bool类型转换方式。


在某些 C 语言的实现中,它将是 0 或 -1 而不是 0 或 1。 - T.J. Crowder
1
只要实现符合标准,就不会出现这种情况。根据当前的草案标准6.3.1.2,“当任何标量值被转换为_Bool时,如果该值与0相等,则结果为0;否则,结果为1。” - Chinmay Kanchi
2
@T.J. Crowder:不是的。逻辑运算符保证计算结果为0或1。具体来说:“逻辑非运算的结果为0,如果其操作数的值与0不相等;如果其操作数的值等于0,则结果为1。”(C99标准的6.5.3.3/5) - jamesdlin

7

使用的标志只有MSB设置为1,所有其他位都被清除,因此当您将其与数字进行按位与操作时,可以测试数字中的MSB。

按位与运算有两个结果:

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

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

Non-zero -> 1
Zero -> 0

所以我们使用双重否定。

同样的事情也可以用以下方式完成:

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

    (n & flag) ? printf("1"):printf("0");
    n = n << 1;
}

交替地,printf(((n & flag) ? "1" : "0")); - Hasturkun

2

我认为将!!x写成x != 0更易理解。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接