2013-07-16 79 views
1

說我有存儲2個字節的緩衝區:按位開關最顯著和至少顯著字節

char *buf=new char[4]; 
// 00000010 00000000 (.. other stuff ..) 

我想要做的就是切換最少,最顯著字節,並將該值存儲在一個變量是什麼。試圖這樣做如下:

short len=buf[1]; 
len <<= 8; 
len |= buf[0]; 
    // Result, as expected: 00000000 00000010 

它的工作原理細粉,除非最顯著字節(BUF [0])是> = 128,這使得所述或運算符(|)填充短的一半1的。例如:

Original: 10000110 00000000 
Should be: 00000000 10000110 
But is: 11111111 10000110 

謝謝(哦,我在讀從文件與file.read(字節...,4); - 甚至都不知道這是有關)

+8

如果要操縱位,請使用無符號類型。如果您想操作數字,請使用簽名類型。 –

+0

如果您不熟悉按位操作,則可以嘗試使用std :: bitset。如果讓你使用像數組一樣的位。完成後,您可以將其轉換回整數。 –

回答

6

您的實施顯然使用有符號數字的two's complement表示。使用無符號值而不是

unsigned char * buf = new unsigned char[2]; 
... 

unsigned short len=buf[1]; 
len <<= 8; 
len |= buf[0]; 
+0

+1 阿門是正確的。你實際上是在執行算術而不是邏輯轉換。見[這裏](http://en.wikipedia.org/wiki/Bitwise_operation#Bit_shifts)...:D – someone

+2

如果'char'被簽名,這將無濟於事; 'buf [0]'在'| ='提升爲'int'時仍然會被擴展。您需要更改'buf'的類型,而不是'len',以防止符號擴展。 –

+0

我聽說右移做標記擴展,但沒有左移。 –

0

試試這個:

unsigned short buf; 
... 
buf = buf << 8 | buf >> 8; 

或者只是進行置換:

char buf[2]; 
char tmp; 
... 
tmp = buf[0]; 
buf[0] = buf[1]; 
buf[1] = tmp; 

我希望這有助於!

0
buff = 11001010 01011100; 
//copy this buff, I am writing it directly below 

copy_of_buff = 11001010 01011100; 
buff_hi = (buff >> 8); //Hence after this exec, buff_hi = 00000000 11001010 
buff_lo = (copy_of_buff << 8); //Hence after this exec, buff_lo = 01011100 00000000 

out_buff = (buff_hi)||(buff_lo); //Hence after this exec, out_buff = 01011100 11001010