2015-11-20 13 views
5

ConcurrentHashMapソースコードを調べていたとき、私は非常に多くのビットワイズシフト演算子に遭遇しました。いくつかは定数を作成するために適用され、いくつかは変数に適用されます。ConcurrentHashMapのビットワイズシフト演算子の使用

static final int MAXIMUM_CAPACITY = 1 << 30; 
static final int MAX_SEGMENTS = 1 << 16; // slightly conservative 
long u = (((h >>> segmentShift) & segmentMask) << SSHIFT) + SBASE; 

MAXIMUM_CAPACITYのような定数は、ビット単位のシフト演算子を使用しての使用が何であるかを直接その後、宣言することができれば、私は、理解することはできませんよ。

+3

デベロッパーは、10進数ではなくバイナリで考えながら、これらの値を定義するのが簡単だったと思います。 '1 << 30'のバイナリ表現は' 1000000000000000000000000000000'であり、ある意味では10進数 '1073741824'よりも「より単純」に見えます。 – Mena

答えて

3

10進数の数値(ベース10)を使用していません。代わりに、 "これは30個の末尾の0ビットである数字"であり、この数字はベース2のシステムに使用されていることを意味しています。

ビットシフトは、値を読者に知らせるのがより簡単になります。基数10では、1073741824となり、乱数のように見えます。


これはプログラミングでよく発生します。たとえば:

int secondsInDay = 60 * 60 * 24; 

私たちは一日に時間の量を乗じた時間における分の量、を乗じた分の秒量を、代表しています。

86400を置くことができましたが、1時間に何分の時間を変更したいのですか(他の惑星で時間を表すために)?値を変更するには、手動で計算する必要があります。

一方、上記のようにユニットを分割すると、60の中身を変更して、1日の分数を変更することができます。