unsigned long set;
/*set is after modified*/
set >>= 1;
これはカーネル システム コールで見つかりましたが、理解できません。どのように機能しますか?
unsigned long set;
/*set is after modified*/
set >>= 1;
これはカーネル システム コールで見つかりましたが、理解できません。どのように機能しますか?
この式は、 byの右シフト ビットであることをset >>= 1;
意味します (ビットごとの右シフト演算子の自己割り当て形式をチェックBitwise Shift Operators )。set = set >> 1;
set
1
>>
次の場合set
を想定します。
BIT NUMBER 31 n=27 m=17 0
▼ ▼ ▼ ▼
set = 0000 1111 1111 1110 0000 0000 0000 0000
その後、set >> = 1;
変数は次のようにset
なります。
BIT NUMBER 31 n=26 m=16 0
▼ ▼ ▼ ▼
set = 0000 0111 1111 1111 0000 0000 0000 0000
シフトされたビット数に注意してください。
興味深い点に注意してください:この操作は論理シフト( unsigned shiftset
) であるため、論理シフトは数値の符号ビットを保持しません。unsigned long
>>
さらに、すべてのビットを右に (下位の有効数字に向かって) シフトしているため、1 つの右シフトは = 数字を 2 で割ります。
このコードを確認してください(最後のポイントを示すためだけに):
int main(){
unsigned long set = 268304384UL;
set >>= 1;
printf(" set :%lu \n", set);
set = 268304384UL;
set /= 2;
printf(" set :%lu \n", set);
return 1;
}
そして出力:
set :134152192
set :134152192
(注:意味はなく>>
、/
どちらも同じです)
同様に<<=
、左シフトの演算子があります。他の利用可能なBitwise 演算子と複合代入演算子を確認し、セクション:ビット式と違い: signed/arithmetic shift と unsigned shiftも確認してください。
これにより、値が 1 ビット「右シフト」されます。整数のすべてのビットを 1 だけ右に移動すると、2 進数は基数 2 の番号付けシステムであるため、事実上「2 で除算」します。
2 進数で 12 という数字があるとします。
1100 = 12 in binary
110 = 6 in binary (1100 right-shifted)
ちょうど、10 進数のすべての桁を 1 つ右に移動すると、10 で割ることになります。
すべての二項演算子は と組み合わせることができます=
。すべての場合において
dest op= expression
と同等です
dest = dest op expression
dest
(副作用がある場合を除き、それらは1回だけ発生します)。
つまり、これは
set>>=1;
次と同等です。
set = set >> 1;
>>
はバイナリ右シフト演算子なので、値を1set
ビット右にシフトすることを意味します。
これにより、ビットが 1 ずつ右にシフトされます。これは、2 で除算することと同じです。ビット シフトの詳細については、 http://msdn.microsoft.com/en-us/library/f96c63ed( v=vs.80) を参照してください。 aspx