Битовая арифметика - объединить два результата в один бит

Я делаю домашнее задание в симуляторе MARS (Assembly), и я застрял на одном часть.

Нам нужно загрузить в регистр 32-битное слово.

Биты с 0 по 7 представляют синий цвет, биты с 8 по 15 — зеленый цвет, а биты с 16 по 23 — красный цвет. Остальные биты устанавливаются равными нулю.

Например, желтый цвет — это 0x00ffff00.

 [31]       [24]|[23]         [16]|[15]         [8] | [7]         [0]
+----+-   -+----+----+- ... -+----+----+- ... -+----+----+- ... -+----+
| 0  | ... | 0  |    RED COLOR    |   GREEN COLOR   |   BLUE COLOR    |
+----+-   -+----+----+- ... -+----+----+- ... -+----+----+- ... -+----+

то есть цветовой формат BGR0 в порядке памяти или 0RGB в машинных словах с собственным порядком байтов.

Домашнее задание разделено на три задания и я на последнем. У нас есть дисплей 64 на 64 пикселя (каждый пиксель равен 4*4, поэтому общая ширина и высота равны 256). Красный цвет всегда равен 0, зеленый — это 4 * номер строки, а синий — 4 * номер столбца. Представьте, что мы находимся на 2-й строке и 3-й строке, зеленое значение будет 2 * 4, а синее значение 3 * 4. Таким образом, в этом примере в шестнадцатеричном формате 12 будет 0xc, а 8 — 0x08, а число, которое должно быть загружено в регистр, будет 0x00000c08.

Итак, мой первый вопрос: как я могу использовать битовую алгебру для объединения результата двух умножений?

И мой второй вопрос таков: представьте, что мы находимся в последней строке и столбце пикселей: 64 * 4 и 64 * 4. Результат равен 256, и мы не можем использовать только 8 бит для представления этого числа, поэтому, вероятно, мне не следует использовать пиксели. От 1 до 64, но от 0 до 63. Верно?


person Favolas    schedule 06.04.2012    source источник
comment
Используйте двоичные сдвиги или умножьте на 2^n. Какой процессор кстати?   -  person BlackBear    schedule 06.04.2012
comment
думаю 0-63 не 1-64. 63 = 0x3F 63 * 4 = 0x3F ‹‹ 2 = 0xFC, что без проблем помещается в 8 бит.   -  person old_timer    schedule 06.04.2012
comment
Windows с процессором x64. Каким будет n в приведенном примере? Извините, но я не понимаю.   -  person Favolas    schedule 06.04.2012
comment
Да, при вычислениях вы обычно считаете с 0, а не с 1, поэтому вы не тратите битовый шаблон 0.   -  person Peter Cordes    schedule 02.08.2018


Ответы (1)


Итак, у вас есть 0x08 и 0x0C, и вы хотите 0x0C08?

Посмотрите битовый сдвиг

В C-подобных языках это будет что-то вроде

(0x0C << 8) | 0x08

(0x0C << 8) gives 0x0C00
person Tony Hopkinson    schedule 06.04.2012
comment
Вы имеете в виду (0x0C << 8) | 0x08? - person harold; 06.04.2012
comment
Да, я имел в виду это, рад видеть, что кто-то обращает внимание - person Tony Hopkinson; 06.04.2012
comment
@ Тони Хопкинсон Спасибо. С вашим предложением удалось решить мою проблему :) - person Favolas; 06.04.2012