我正在一個項目,我正在閱讀內存位置,需要輸出他們的十六進制值在ASCII。二進制右移,給定只有加
該語言給我一個16位的字長,所以我需要劃分一次抓取一個半字節轉換爲十六進制。不幸的是,這種語言只提供和/或不添加數學/邏輯功能。
我想我可以通過左移和測試一個負面標誌在移動後添加1到結尾來創建所需的效果,但我認爲必須有一個更好的方法來做到這一點。
任何有識之士將不勝感激。
我正在一個項目,我正在閱讀內存位置,需要輸出他們的十六進制值在ASCII。二進制右移,給定只有加
該語言給我一個16位的字長,所以我需要劃分一次抓取一個半字節轉換爲十六進制。不幸的是,這種語言只提供和/或不添加數學/邏輯功能。
我想我可以通過左移和測試一個負面標誌在移動後添加1到結尾來創建所需的效果,但我認爲必須有一個更好的方法來做到這一點。
任何有識之士將不勝感激。
所以我使用的原始方法工作。我還想出了另一個,讓任何人再次遇到這個問題。
我建立了同時評估4位,並創建一個基於評價一個數字,它看起來像這樣一些C風格的僞代碼子程序:
16bitSignedInt bin; //binary being analyzed
int value; //number being built
for (int i = 0; i < 4; i++) // while 0-3, for each nibble of the 16 bits
{
if (bin.bit15 = 1)
value += 8; // dominate bit in nibble
bin <<= 1; // left shift 1
if (bin.bit15 = 1)
value += 4; // 2nd bit in nibble
bin <<= 1; // left shift 1
if (bin.bit15 = 1)
value += 2; // 3rd bit in nibble
bin <<= 1; // left shift 1
if (bin.bit15 = 1)
value += 1; // last bit in nibble
bin <<= 1; // left shift 1
//do work with value
}
原油,但有效。
使用AND
你可以設置所有的位清零除了最後顯著四位:
0101010111010101
0000000000001111 AND
----------------
0000000000000101
通過右移了整個事情,你可以閱讀下四位:
0101010111010101 SHR 4
----------------
010101011101
0000000000001111 AND
----------------
0000000000001101
是這樣的對你有什麼用處?
你有攜帶嗎?而不是負面的測試添加結束位,並添加一個帶有進位的零來放回到右側。真的沒有太多節省。到目前爲止,我想不出其他的解決方案中,左移,測試了一下,如果設置加1到的東西,轉移的東西:
uint a,b,i;
b=0;
for(i=0;i<4;i++)
{
b=b+b;
if(a&0x8000) b+=1;
a=a+a;
}
如果上述UINT爲16位,然後上面會給你右移12. a將在創建b的過程中被銷燬,如書面。
沒有攜帶附加物。 =/ – DivinusVox 2011-04-01 00:21:13
我認爲你只限於一堆左派。 – 2011-04-01 02:55:55
你可以反過來試試:不是試圖實現正確的轉變,你可以使用暴力。這裏是一個最高半字節的例子:
unsigned rez, tmp;
for (rez = 0, tmp = some_word & 0x0FFF; tmp != some_word; rez++, tmp += 0x1000);
已經應用掩碼來清除無關位。我遇到的麻煩是語言中沒有右移操作。必須弄清楚如何通過16位值的有符號整數加法來創建該操作。我現在正在做的是屏蔽該值,檢查位15上的1,如果存在,則左移並加1,否則左移。這看起來效率很低,我必須爲這個方法中的每個半字節建立一個子程序。 – DivinusVox 2011-03-31 11:22:35