获取 char 中的位数

Get number of bits in char

提问人:mkluwe 提问时间:2/12/2010 最后编辑:mkluwe 更新时间:6/12/2021 访问量:14864

问:

如何获取类型的位数?char

我从中知道。这被描述为 »该宏为用于表示 char 类型的对象的位数生成最大值。我理解这意味着 a 中的位数,不是吗?CHAR_BITclimitschar

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

C++

评论


答:

10赞 R Samuel Klatchko 2/12/2010 #1

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

sizeof(char) * CHAR_BIT

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

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

1赞 Mark Wilkins 2/12/2010 #2

一种非高效的方法:

char c;
int bits;
for ( c = 1, bits = 0; c; c <<= 1, bits++ )
   ;
printf( "bits = %d\n", bits );
15赞 AnT stands with Russia 2/12/2010 #3

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

numeric_limits<>::d igits 是给定类型的值表示形式的无符号位数。

你需要哪一个?

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

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

对于类型,对象表示的 bit-size () 保证与值表示的 bit-size 相同,因此您可以互换使用,但从概念的角度来看,这可能是值得怀疑的。unsigned charCHAR_BITnumeric_limits<unsigned char>::digitsCHAR_BIT

评论

0赞 mkluwe 2/12/2010
好吧,我忘了提到为什么我不满足于使用CHAR_BIT:我想获得一些模板化代码中的位数,numeric_limits<>更适合我的第一个视图。但是,正如 R Samuel Klatchko 所提到的,使用 sizeof(char) * CHAR_BIT 的方法可以完成这项工作。
2赞 t0mm13b 2/12/2010 #4

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

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

希望这会有所帮助, 此致敬意 汤姆。

0赞 stconnell 6/12/2021 #5

这里还没有声誉,所以我不被允许回复@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 的位,并且不计算它们。