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;
}
4

3 回答 3

10

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

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

这是一个穷人的布尔型。

于 2010-02-06T08:05:02.000 回答
7

使用的标志只设置了 MSB 并清除了所有其他位,因此当您bitwise and使用数字时,您可以测试数字中的 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;
}
于 2010-02-06T08:04:14.730 回答
2

我会写得!!x不那么混乱x != 0

于 2010-02-06T08:48:44.773 回答