私はCと連携しており、32ビット符号なし整数のビットを変更する方法を理解しようとしています。私はバイナリで符号なし整数のバイトグループを手動で変更する
int a = 17212403u;
を持っている場合、例えば
は、それが1000001101010001111110011
なります。さて、私はこれらのビットを、リトルエンディアン形式で配置されていると仮定すると、最大のビットは1を表し、2番目のビットは2番目のビットを表し、以下同様に、ビットのグループを手動で変更できますか?
たとえば、11番目のビットから15番目のビットに10進値17が入るようにビットを変更したいとします。これはどのように可能ですか?
私は、次のようなことで、その範囲を得ることを考えていた:
unsigned int range = (a << (sizeof(a) * 8) - 14) >> (28)
しかし、私は今から上に行くためにどこか分かりません。
'int a = 17212403u;'は_unsigned_値を_signed_変数に割り当てています。確かにシフトを実行することは、符号なしの変数と定数を使うことで問題が少なくなります。 'unsigned a = 17212403u; ' – chux
17は10001Bです。ビット11-15も5ビットなのでフィットします。まず、NOT(11111B << 11)のマスクでANDをとることによって、これらのビットを強制的にローにします。その後、17を11箇所上にシフトして、それをORします。 –
リトルビッグエンディアンとビッグエンディアンは、ビット「オーダー」には適用されません。ビットは個々にアドレス可能ではないので、アピールするためのより低いアドレスの概念はない。しかし、リトルエンディアン*バイト*の順序は、「最も左の」バイト(最下位のアドレスを持つバイト)が低位のエンドであることを意味します。これは、「リトルエンディアン」が意味するものとは逆の意味です。 – rici