受け入れられた答えは、エンディアンが記憶の観点からの概念であることを指摘していますが。しかし、私はそれが質問に直接答えるとは思いません。
一部の回答では、ビット単位の演算はエンディアンに依存せず、プロセッサは他の方法でバイトを表す場合があります。とにかく、それはエンディアンが抽象化されることについて話している。
しかし、たとえば紙でビットごとの計算をするとき、最初にエンディアンを述べる必要はありませんか?ほとんどの場合、エンディアンを暗黙的に選択します。
たとえば、次のようなコード行があるとします。
0x1F & 0xEF
紙の上でどのように結果を手作業で計算しますか?
MSB 0001 1111 LSB
1110 1111
result: 0000 1111
そこで、ここではビッグエンディアン形式を使用して計算を行います。リトルエンディアンを使用して、同じ結果を計算して取得することもできます。
ところで、コードで数値を書くと、ビッグエンディアン形式のようなものだと思います。123456
または0x1F
、最も重要な数字は左から始まります。
繰り返しますが、紙に値のバイナリ形式を書き込むとすぐに、エンディアネスをすでに選択していると思います。メモリから見ると、値が表示されています。
したがって、質問に戻ると、シフト操作<<
はLSB(最下位バイト)からMSB(最上位バイト)へのシフトと考える必要があります。
次に、質問の例と同様に:
numb=1025
リトル・エンディアン
LSB 00000001 00000100 00000000 00000000 MSB
だから、<< 10
されるだろう10bit
からLSB MSBにシフトします。
<< 10
ステップごとのリトルエンディアン形式の比較と操作:
MSB LSB
00000000 00000000 00000100 00000001 numb(1025)
00000000 00010000 00000100 00000000 << 10
LSB MSB
00000000 00000100 00010000 00000000 numb(1025) << 10, and put in a Little Endian Format
LSB MSB
00000001 00000100 00000000 00000000 numb(1205) in Little Endian format
00000010 00001000 00000000 00000000 << 1
00000100 00010000 00000000 00000000 << 2
00001000 00100000 00000000 00000000 << 3
00010000 01000000 00000000 00000000 << 4
00100000 10000000 00000000 00000000 << 5
01000000 00000000 00000001 00000000 << 6
10000000 00000000 00000010 00000000 << 7
00000000 00000001 00000100 00000000 << 8
00000000 00000010 00001000 00000000 << 9
00000000 00000100 00010000 00000000 << 10 (check this final result!)
うわー!OPの説明どおり、期待どおりの結果が得られます。
OPが期待した結果を得られなかった問題は次のとおりです。
彼はLSBからMSBにシフトしなかったようです。
リトルエンディアン形式でビットをシフトする場合、次のことを理解する必要があります(感謝します)。
LSB 10000000 00000000 MSB << 1
は
LSB 00000000 00000001 MSB
、ではない
LSB 01000000 00000000 MSB
個人ごとに8bits
、実際にはMSB 00000000 LSB
ビッグエンディアン形式で記述しているためです。
だからそれは
LSB[ (MSB 10000000 LSB) (MSB 00000000 LSB) ]MSB
総括する:
ビット単位の演算はblablablabla ...で抽象化されていると言われていますが、ビット単位の演算を手動で計算する場合、バイナリ形式を紙に書き留めるときに使用するエンディアンを知る必要があります。また、すべてのオペレーターが同じエンディアンを使用するようにする必要もあります。
OPが期待どおりの結果を得られなかったのは、彼がシフティングを誤ったためです。