打印字符的二进制格式

3

几个月前,我写了一个函数来打印 char 的二进制格式,代码如下,并且它运行良好:

void PrnCharBit(char x)
{
        int i,mask;
        for(i=CHAR_BIT;i>=1;i--)
        {
            mask=(1<<(i-1))&x;
            putchar((mask==0)?'0':'1');
        }
        putchar('\n');
}

今天我想使用这个函数,所以我写了一个几乎和上面的函数一样:

void PrnCharBit(char c)
{
    int i;
    char mask=0;
    //printf("%d\n",CHAR_MAX);
    for(i=sizeof(char)*CHAR_BIT-1;i>=0;i--)
    {
        mask=1<<i;
        if(mask&c==0) putchar('0');
        else putchar('1');
    }
    putchar('\n');
}

然而,第二个函数没有起作用。我不知道为什么,因为这两个函数几乎是相同的!为什么第二个函数没有产生相同的结果?


1
为什么不直接使用第一个函数呢?它能正常工作且更短。 - John Zwinck
CHAR_BIT 的值是多少?如果 PrnCharBit('#'),那么二进制值应该是多少? - mahendiran.b
3
既然标记为 C++,则代码 std::cout << std::bitset<CHAR_BIT>(c); 的含义是将变量 c 转换成二进制,并输出到控制台。 - user657267
3
运算符优先级。Clang 给出以下警告:& 的优先级低于 ==;== 将首先被评估 - 在您的第二个函数中,将 if(mask&c==0) 更改为 if((mask&c)==0) - Niall
请注意,根据标准,sizeof(char)的值为1(不考虑底层平台)。 - barak manos
1个回答

14

运算符优先级。等于运算符 (==) 在位运算操作(&)之前。

Clang警告如下;

& 的优先级低于 ==;将首先评估 ==

在第二个函数中,将 if(mask&c==0) 更改为 if((mask&c)==0)


谢谢!错误已经修复了!(太奇怪了,& 的优先级竟然比 == 还低) - user3905370

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