我正在嘗試將數字0xFD00保存在暫存器中(MIC-1 架構)。有暫存器:
- 0
- 1
- -1
- AMASK:0x0FFF
- 面具:0x00FF
我可以進行左移、右移和反轉。也可以添加 SMASK SMASK 或 AMASK (-1) 等值。我可以通過逆(AMASK)獲得 0xF000,但我不確定如何在沒有太多步驟的情況下獲得 0xFD00。
uj5u.com熱心網友回復:
迄今為止最有效的序列是@Falk Hüffner 的回答,3 次操作。(盡管它涉及的 a 不添加 1 或 -1 或自身的值)。
該答案顯示了一種方法,該方法采用問題標題中明確提到的 4 種操作。
0xFD 是0b11111101. 所以它有一堆連續的位,還有一個雜散設定位。一種簡單的方法是
- 開始全1( ,
-1,~0或0 - 1) - 左移 2 得到
...11111100 - 加 1 得到
...11111101(0x...FD) - 移到暫存器的頂部,移入低 0 并移出高 1,將
0xFD8 個低零留在頂部。
我不知道 MIC-1,但從你的描述看來它可以完成這些步驟。如果一次只能移位 1 個位置,則總共需要 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 向量:類似的問題,您可以-1在不從記憶體加載的情況下廉價生成動態,并通過各種其他指令(如左移)提供它,(SSSE3 ) 絕對值。但只值得為短序列做,否則只需從記憶體或 mov-immediate 加載到整數暫存器和movd xmm0, eax)
十六進制只是在文本中表示數字的一種方式,例如 ASCII。 您可以將其稱為序列化格式。
0xFD00只是另一種寫法64768(base 10)或0b1111110100000000(base 2)。因此,您只是在移位和 inc/dec 的暫存器中構造一個數字。假設您的位移乘以/除以 2,而不是 10 或 16,這些是二進制操作,所以這是一個二進制數。以像十六進制這樣的緊湊格式表示所需的二進制數很方便,但在任何時候你都不需要十六進制,就像一串 base-16 ASCII 數字。
當您在暫存器中構造它時,它不是“十六進制數”,它只是一個數字。 如果有的話,它是二進制的。
uj5u.com熱心網友回復:
假設可以使用兩個暫存器進行加法,而不僅僅是一個常數,并且左移只會洗掉從 16 位字中移出的位:
t = ~SMASK // 0xff00
return t (t << 1)
如果可以通過任意常數而不只是 1 進行移位,則另一種選擇是
t = SMASK
t = -1
t = -1
t <<= 8
uj5u.com熱心網友回復:
0xFD00 的倒數 == 0b00000010 11111111 = 0x02ff
這可以通過 SMASK = 0x00FF * 3 2 或簡單地使用 SMASK | 來實作。(1 << 9),如果可用的話。
a = smask
b = smask << 1
a = a b
a
a
return ~a
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/406274.html
標籤:
