5

32ビットの2進数を持っていて、その2進数の下位16ビットを自分が持っている16ビットの数値に置き換え、その数値の上位16ビットを保持して新しい2進数を生成したい場合。単純なビット単位の演算子を使用してこれを行うにはどうすればよいですか?

たとえば、32ビットの2進数は次のとおりです。

1010 0000 1011 1111 0100 1000 1010 1001

そして私が持っている下位16ビットは次のとおりです。

                    0000 0000 0000 0001

したがって、結果は次のようになります。

1010 0000 1011 1111 0000 0000 0000 0001

これどうやってするの?

4

4 に答える 4

8

これは2つのステップで行います。

  • 置き換えたいビットをマスクします(そしてそれを0で)
  • 置換を入力します(または新しいビットで入力します)

だからあなたの場合、

i32 number;
i32 mask_lower_16 = FFFF0000;
i16 newValue;

number = (number AND mask_lower_16) OR newValue;

実際のプログラミング言語の実装では、16ビット値の符号拡張の問題にも対処する必要がある場合があります。たとえば、Javaでは、次のshortように上位16ビットをマスクする必要があります。

    short v = (short) 0xF00D;
    int number = 0x12345678;
    number = (number & 0xFFFF0000) | (v & 0x0000FFFF);
    System.out.println(Integer.toHexString(number)); // "1234f00d"
于 2010-03-05T05:55:00.637 に答える
3
(original32BitNumber & 0xFFFF0000) | 16bitNumber
于 2010-03-05T05:55:16.157 に答える
1

さて、私はあなたに答えを言うことができました。しかし、おそらくこれは宿題です。だから私はしません。

いくつかのオプションがあることを考慮してください。

| // bitwise OR
^ // bitwise XOR
& // bitwise AND

たぶん、小さなテーブルを作成して、どちらが正しい結果をもたらすかを決定します(大きい2進数の正しいセクションを操作する場合)。

于 2010-03-05T05:55:41.600 に答える
1

&を使用して下位ビットをマスクしてから| 16ビット値を32ビット値とマージします

 uint  a = 0xa0bf68a9
 short b = 1

 uint  result = (a & 0xFFFF0000) | b;
于 2010-03-05T05:56:12.847 に答える