私は次のステートメントの少しの説明が必要です、それは何をしていますか?:
int result = 154 + (153 << 8) + (25 << 16) + (64 << 24);
/* what would be the value of result after this line and how it is calculated
Why we need this? */
私は次のステートメントの少しの説明が必要です、それは何をしていますか?:
int result = 154 + (153 << 8) + (25 << 16) + (64 << 24);
/* what would be the value of result after this line and how it is calculated
Why we need this? */
(153 << 8)
と同等です153 * pow(2, 8)
あなたは実際にあなたのビットを左にシフトしています。
また: -
(153 >> 8)
と同等です153 / pow(2, 8)
理由は推測できます。これは実際にはビットを右にシフトしています。
EG:-
3 => 0011
3 << 2 is equal to 1100 -> (Which is code for 12)
3 >> 2 is equal to 0000 -> (Which is code for 0) -> you can see - **(3 / 4 = 0)**
注:-注意してくださいright shifting rounds off towards negative infinity
。
EGの場合:-
-3 >> 1 --> -2 (-1.5 is rounded to -2)
それがどのように起こるか見てみましょう:-
バイナリ文字列表現の場合:-
-3 ==> 11111111111111111111111111111101
-3 >> 1 ==> 11111111111111111111111111111110 (-3 / 2 = -1.5 -> rounded to -2)
(左端のビットは、シフト前の左端に存在していたビット(この場合は1)で埋められていることに注意してください)
したがって、値は-2になります(-3 >> 1の場合、これはより大きいです-3
)。これは負の数の場合に発生します。Right shifting a negative number gives a number greater than the original number..
これは、左端のビットが0
...で埋められる正の数とは反対です。value obtained will be less than the original..
3 ==> 00000000000000000000000000000011
3 >> 1 ==> 00000000000000000000000000000001 (3 / 2 = 1.5 -> rounded to 1)
(したがって、左端のビットは0のままです。したがって、値は1(3未満)です。つまり、値は負の無限大に向かって四捨五入され、1.5から1になります)
同様に、left-shifting
正の数と負の数の結果を考案できます。
答えは1075419546です。左シフト演算子は基本的に10進数の2進表現に0を追加しているので、これは単純に次のようになります。
154 + 153 * 2 ^ 8 + 25 * 2 ^ 16 + 64 * 2 ^ 24
So you can convert 153 to its binary representation, then add 8 zeros and convert back to decimal etc etc..
実際には、数式で指定された演算子を使用すると、次のようになります。
123<<nは123*2^nとまったく同じです
たとえば、2<<2は2*2 ^ 2であり、これは8または1000と同じです。
それ以外の場合は、ビットを左にシフトするだけです。
3 = 11、次に3 << 2=1100。
それが明らかになることを願っています。