簡體   English   中英

通過移位、反轉和加 +/- 1 構造十六進制數

[英]Constructing a hex number by shifting, inverting and adding +/- 1

我正在嘗試將數字0xFD00保存在寄存器中(MIC-1 架構)。 有寄存器:

  • 0
  • +1
  • -1
  • AMASK:0x0FFF
  • 面具:0x00FF

我可以進行左移、右移和反轉。 也可以添加 SMASK + SMASK 或 AMASK + (-1) 等值。 我可以通過逆(AMASK)獲得 0xF000,但我不確定如何在沒有太多步驟的情況下獲得 0xFD00。

0xFD 是0b11111101 所以它有一堆連續的位,還有一個保持設置位。 所以一種簡單的方法是

  • 以全 1 開頭( -1~00 - 1
  • 左移 2 得到...11111100
  • 加 1 得到...11111101 (0x...FD)
  • 移到寄存器的頂部,移入低 0 並移出高 1,將0xFD留在頂部,有 8 個低零。

我不知道 MIC-1,但從你的描述看來它可以完成這些步驟。 如果一次只能移位 1 個 position,則總共需要 2 + 8 個移位指令。 可能還有其他方法可以更有效地構造這個常數,也許是我沒有想到的東西,或者機器有一些能力。


利用 AMASK / SMASK 和 add / sub carry-propagation 的方式可以分別翻轉 1 / 0 位的序列,以及 Aki 觀察到~0xfd00 = 0x02ff ,我們可以執行以下操作:

initial AMASK = 0x00FF

AMASK += 1     (0x0100)
AMASK += AMASK (0x0200)  (left shift)
AMASK += SMASM (0x02FF)
NOT AMASK      (0xFD00)

請參閱https://catonmat.net/low-level-bit-hacks以了解您可以使用按位運算處理的各種惡作劇。 (盡管其中許多還需要 AND、OR 或 XOR。例如,通過x &= (x-1)清除最低設置位)


(相關:動態生成向量常量的最佳指令序列是什么?對於 x86 SIMD 向量:類似的問題,您可以在不從 memory 加載的情況下廉價地動態生成-1 ,並通過各種其他指令(如左移)輸入它, (SSSE3)絕對值。但只值得為短序列做,否則只需從 memory 或 mov-immediate 加載到 integer regsiters 和movd xmm0, eax


十六進制只是在文本中表示數字的一種方式,例如 ASCII。 您可以將其稱為序列化格式。

0xFD00只是另一種寫入64768 (基數 10)或0b1111110100000000 (基數 2)的方式。 因此,您只是在移位和 inc/dec 的寄存器中構造一個數字 假設您的位移乘以/除以 2,而不是 10 或 16,這些是二進制操作,所以這是一個二進制數。 以像十六進制這樣的緊湊格式表示所需的二進制數很方便,但在任何時候你都不需要十六進制,就像一串base-16 ASCII數字。

當您在寄存器中構造它時,它不是“十六進制數”,它只是一個數字。 如果有的話,它是二進制的。

0xFD00 的倒數 == 0b00000010 11111111 = 0x02ff

這可以通過 SMASK = 0x00FF * 3 + 2 或簡單地使用 SMASK | 來實現。 (1 << 9),如果可用的話。

a = smask
b = smask << 1
a = a + b
a++
a++
return ~a

假設左移只是刪除移出 16 位字的位:

t = ~SMASK    // 0xff00
return t + (t << 1)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM