2011-03-31 55 views
0

我正在一個項目,我正在閱讀內存位置,需要輸出他們的十六進制值在ASCII。二進制右移,給定只有加

該語言給我一個16位的字長,所以我需要劃分一次抓取一個半字節轉換爲十六進制。不幸的是,這種語言只提供和/或不添加數學/邏輯功能。

我想我可以通過左移和測試一個負面標誌在移動後添加1到結尾來創建所需的效果,但我認爲必須有一個更好的方法來做到這一點。

任何有識之士將不勝感激。

回答

0

所以我使用的原始方法工作。我還想出了另一個,讓任何人再次遇到這個問題。

我建立了同時評估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 
} 

原油,但有效。

0

使用AND你可以設置所有的位清零除了最後顯著四位:

0101010111010101 
0000000000001111 AND 
---------------- 
0000000000000101 

通過右移了整個事情,你可以閱讀下四位:

0101010111010101 SHR 4 
---------------- 
    010101011101 
0000000000001111 AND 
---------------- 
0000000000001101 

是這樣的對你有什麼用處?

+0

已經應用掩碼來清除無關位。我遇到的麻煩是語言中沒有右移操作。必須弄清楚如何通過16位值的有符號整數加法來創建該操作。我現在正在做的是屏蔽該值,檢查位15上的1,如果存在,則左移並加1,否則左移。這看起來效率很低,我必須爲這個方法中的每個半字節建立一個子程序。 – DivinusVox 2011-03-31 11:22:35

0

你有攜帶嗎?而不是負面的測試添加結束位,並添加一個帶有進位的零來放回到右側。真的沒有太多節省。到目前爲止,我想不出其他的解決方案中,左移,測試了一下,如果設置加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的過程中被銷燬,如書面。

+0

沒有攜帶附加物。 =/ – DivinusVox 2011-04-01 00:21:13

+0

我認爲你只限於一堆左派。 – 2011-04-01 02:55:55

0

你可以反過來試試:不是試圖實現正確的轉變,你可以使用暴力。這裏是一個最高半字節的例子:

unsigned rez, tmp; 
for (rez = 0, tmp = some_word & 0x0FFF; tmp != some_word; rez++, tmp += 0x1000);