Алгоритм для поразрядной игры

Если у меня есть 32-разрядное двоичное число, и я хочу заменить более низкое 16-разрядное из двоичного числа с 16-разрядным числом, что я имею и сохраняю верхнее 16-разрядное из того числа для создания нового двоичного числа.. как я могу сделать этот использующий простой побитовый оператор?

Например, 32-разрядное двоичное число:

1010 0000 1011 1111 0100 1000 1010 1001

и более низкое 16-разрядное, которое я имею:

                    0000 0000 0000 0001

таким образом, результат:

1010 0000 1011 1111 0000 0000 0000 0001

как я могу сделать это?

5
задан polygenelubricants 2 May 2010 в 13:53
поделиться

4 ответа

Вы делаете это в два этапа:

  • Замаскируйте биты, которые вы хотите заменить (И их нули)
  • Заполните замены (ИЛИ с новыми битами)

Итак, в вашем случае

i32 number;
i32 mask_lower_16 = FFFF0000;
i16 newValue;

number = (number AND mask_lower_16) OR newValue;

В реальной реализации языка программирования вам также может потребоваться решить проблему расширения знака для 16-битного значения. В Java, например, вам нужно замаскировать верхние 16 бит короткого короткого следующим образом:

    short v = (short) 0xF00D;
    int number = 0x12345678;
    number = (number & 0xFFFF0000) | (v & 0x0000FFFF);
    System.out.println(Integer.toHexString(number)); // "1234f00d"
8
ответ дан 18 December 2019 в 14:44
поделиться
(original32BitNumber & 0xFFFF0000) | 16bitNumber
3
ответ дан 18 December 2019 в 14:44
поделиться

Что ж, я могу сказать вам ответ. Но, возможно, это домашнее задание. Так что я не буду.

Учтите, что у вас есть несколько вариантов:

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

Может быть, составьте небольшую таблицу и решите, какая из них даст вам правильный результат (когда вы работаете с правой частью вашего большего двоичного числа).

1
ответ дан 18 December 2019 в 14:44
поделиться

используйте &, чтобы замаскировать младшие биты, а затем | чтобы объединить 16-битное значение с 32-битным значением

 uint  a = 0xa0bf68a9
 short b = 1

 uint  result = (a & 0xFFFF0000) | b;
1
ответ дан 18 December 2019 в 14:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: