获取char中的位数

时间:2010-02-11 19:38:08

标签: c++

如何获取char类型的位数?

我从CHAR_BIT了解climits。这被描述为»宏产生用于表示char类型的对象的位数的最大值。«Dikumware's C Reference。我明白这意味着char中的位数,不是吗?

我可以用std::numeric_limits以某种方式得到相同的结果吗? std::numeric_limits<char>::digits正确地返回7,但不幸的是,因为此值尊重此处8位字符的签名...

5 个答案:

答案 0 :(得分:13)

根据定义,

CHAR_BIT[signed/unsigned] char类型的对象表示中的位数。

numeric_limits<>::digits是给定类型的值表示中的非符号位数。

你需要哪一个?

如果要查找对象表示中的位数,那么正确的方法是采用该类型的sizeof并将其乘以CHAR_BIT(当然,乘法中没有意义) sizeofchar类型的特定情况下,由于它们的大小始终为1,因此根据定义,CHAR_BIT alredy包含您需要的内容。

如果您正在讨论价值表示,那么numeric_limits<>就是您的选择。

对于unsigned char类型,对象表示的位大小(CHAR_BIT)保证与值表示的位大小相同,因此您可以使用numeric_limits<unsigned char>::digits和{{ 1}}可互换,但从概念的角度来看,这可能是有问题的。

答案 1 :(得分:10)

如果您想过于具体,可以这样做:

sizeof(char) * CHAR_BIT

如果你知道你肯定会使用sizeof char,那就有点矫枉过正,因为sizeof(char)保证为1。

但是如果你转移到另一种类型,例如wchar_t,这将很重要。

答案 2 :(得分:2)

查看此代码here的代码段存档,这是一个改编版本,我不会声明此代码:

int countbits(char ch){
    int n = 0;
    if (ch){
        do n++;
        while (0 != (ch = ch&(ch-1)));
    }
    return n;
}

希望这有帮助, 最好的祝福, 汤姆。

答案 3 :(得分:1)

一种无效的方式:

char c;
int bits;
for ( c = 1, bits = 0; c; c <<= 1, bits++ )
   ;
printf( "bits = %d\n", bits );

答案 4 :(得分:0)

这里还没有声誉,所以我不允许回复@t0mm13b 的回答,但想指出代码有问题:

int countbits(char ch){
    int n = 0;
    if (ch){
        do n++;
        while (0 != (ch = ch&(ch-1)));
    }
    return n;
}

以上不会统计一个字符的位数,会统计设置的位数(1位)。

例如,以下调用将返回 4:

char c = 'U';
countbits(c);

代码:

ch = ch & (ch - 1)

是一种去除设置为 1 的最右边(最低有效)位的技巧。因此,它会掩盖设置为 0 的所有位并且不计算它们。