36
unsigned long set;
/*set is after modified*/
set >>= 1;

これはカーネル システム コールで見つかりましたが、理解できません。どのように機能しますか?

4

5 に答える 5

58

この式は、 byの右シフト ビットであることをset >>= 1;意味します (ビットごとの右シフト演算子の自己割り当て形式をチェックBitwise Shift Operators )。set = set >> 1;set1>>

次の場合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も確認してください。

于 2013-07-21T07:13:21.060 に答える
16

これにより、値が 1 ビット「右シフト」されます。整数のすべてのビットを 1 だけ右に移動すると、2 進数は基数 2 の番号付けシステムであるため、事実上「2 で除算」します。

2 進数で 12 という数字があるとします。

1100 = 12 in binary
 110 =  6 in binary (1100 right-shifted)

ちょうど、10 進数のすべての桁を 1 つ右に移動すると、10 で割ることになります。

于 2013-07-21T07:14:12.940 に答える
6

すべての二項演算子は と組み合わせることができます=。すべての場合において

dest op= expression

と同等です

dest = dest op expression

dest(副作用がある場合を除き、それらは1回だけ発生します)。

つまり、これは

set>>=1;

次と同等です。

set = set >> 1;

>>はバイナリ右シフト演算子なので、値を1setビット右にシフトすることを意味します。

于 2013-07-21T07:18:13.363 に答える
4

これにより、ビットが 1 ずつ右にシフトされます。これは、2 で除算することと同じです。ビット シフトの詳細については、 http://msdn.microsoft.com/en-us/library/f96c63ed( v=vs.80) を参照してください。 aspx

于 2013-07-21T07:14:44.863 に答える