8

如何获得类型的位数char

我知道CHAR_BITclimits. 这被描述为 »宏产生用于表示 char 类型对象的位数的最大值。« 在Dikumware 的 C 参考。我知道这意味着 a 中的位数char,不是吗?

我能以std::numeric_limits某种方式得到相同的结果吗?std::numeric_limits<char>::digits正确返回7但不幸的是,因为此值尊重此处 8 位字符的符号性……</p>

4

5 回答 5

15

CHAR_BIT根据定义,是类型的对象表示中的位数[signed/unsigned] char

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

你需要哪一个?

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

如果您在谈论价值表示,那么numeric_limits<>就是要走的路。

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

于 2010-02-11T20:06:25.407 回答
10

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

sizeof(char) * CHAR_BIT

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

但是,如果您改用其他类型,例如 wchar_t,那将很重要。

于 2010-02-11T19:56:02.440 回答
2

在此处查看此代码的片段存档,这是一个改编版本,我不主张此代码:

int countbits(char ch){
    诠释 n = 0;
    如果 (ch){
        做n++;
        而 (0 != (ch = ch&(ch-1)));
    }
    返回 n;
}

希望这会有所帮助,最好的问候,汤姆。

于 2010-02-11T20:29:26.197 回答
1

一种低效的方式:

char c;
int bits;
for ( c = 1, bits = 0; c; c <<= 1, bits++ )
   ;
printf( "bits = %d\n", bits );
于 2010-02-11T20:06:22.620 回答
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 的位并且不计算它们。

于 2021-06-11T16:56:55.983 回答