Алгоритм побитного трюка - PullRequest
5 голосов
/ 05 марта 2010

Если у меня есть 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

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

Ответы [ 4 ]

8 голосов
/ 05 марта 2010

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

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

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

i32 number;
i32 mask_lower_16 = FFFF0000;
i16 newValue;

number = (number AND mask_lower_16) OR newValue;

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

    short v = (short) 0xF00D;
    int number = 0x12345678;
    number = (number & 0xFFFF0000) | (v & 0x0000FFFF);
    System.out.println(Integer.toHexString(number)); // "1234f00d"
3 голосов
/ 05 марта 2010
(original32BitNumber & 0xFFFF0000) | 16bitNumber
1 голос
/ 05 марта 2010

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

 uint  a = 0xa0bf68a9
 short b = 1

 uint  result = (a & 0xFFFF0000) | b;
1 голос
/ 05 марта 2010

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

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

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

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

...