2017-06-07 10 views
2

たとえば、次のコードは、特定のシステムで間違っているかもしれないと仮定していませんか?他のタイプのビット数を決定するための基礎としてCHAR_BITを使用できますか?

// Number of bits in an unsigned long long int: 
const int ULLONG_BIT = sizeof(unsigned long long int) * CHAR_BIT; 
+0

理論的には、これらのビットのいくつかはパディングビットであるかもしれません。 – PSkocik

+1

目的は何ですか?保管または計算? –

+0

計算 - この質問を投稿するように促した問題は、パリティのためにintの1ビットを数えていました。 –

答えて

3

元の質問に対するPSkocikのコメントに同意します。 C11 6.2.6はCHAR_BIT * sizeof (type)typeオブジェクト表現のビット数を出力しますが、その一部はパディングビットである可能性があります。

私は「ノー仮定」のコードのための最善の策は、単に(すべて同じ値に評価すべきか~0ULLまたは(unsigned long long)(-1LL)、)ULLONG_MAXの値をチェックすることです容疑者

#include <limits.h> 

static inline int ullong_bit(void) 
{ 
    unsigned long long m = ULLONG_MAX; 
    int n = 0, i = 0; 
    while (m) { 
     n += m & 1; 
     i ++; 
     m >>= 1; 
    } 
    if (n == i) 
     return i; 
    else 
     return i-1; 
} 

値のバイナリパターンがすべて1の場合、unsigned long longが保持できるビット数は、値の2進数の数と同じです。

それ以外の場合、バイナリの最大値に0が含まれているため、最上位ビットは実際には使用できません。

関連する問題