2012-01-02 64 views
2

可能重複:
Explanation of an algorithm to set, clear and test a single bit如何使用個人位?

我有一個unsigned char。我想將第2到第4位(從最低有效位計數爲0)複製到另一個unsigned char作爲前三位。例如,在

abcdefgh // a,b,c,d,e,f,g,h are 0 or 1 

成爲

00000def 

我已經試過

unsigned char input, output; 
output = (input << 3) >> 5; 

不工作,但

output = (input << 3) 
output >>= 5; 

確實工作。

C中有一種方法可以在一行中完成此操作嗎?

+1

有** sooo **這個問題很多重複。我上面鏈接的一個是想要一點點的特殊情況,但它很容易概括。 – 2012-01-02 23:18:57

+0

它不起作用,因爲'input << 3'是一個'int',而不是'unsigned char'。 '輸出=(無符號字符)(輸入<< 3) >> 5;'工作。 – pmg 2012-01-02 23:19:55

+0

@pmg或'輸出=((無符號整數)輸入<< 3) >> 5;'所以這兩個按位移將在無符號操作數上完成 – ouah 2012-01-02 23:26:21

回答

8

移,然後屏蔽掉其他:

output = (input >> 2) & 0x07; 
+4

掩碼應該是0x07 – ouah 2012-01-02 23:16:24

+0

謝謝。 – rsaxvc 2012-01-02 23:22:20

0

試試這個:

unsigned char input, output; 
input = 0x12abcdef; 
output = ((input & 0x00fff000) >> 3) & 0x00000fff; 

我不認爲你可以只轉移來回在同一行,並假定每次你移動的空間被零填充,但這可能是編譯器的依賴,如果你這樣做,你會得到正確的保證。

我假設「前三位」是指3個最低有效位,它是小端系統中最左邊或前3位。

+0

這個編譯器將這個bit-endianness抽象出來,LSB在右邊,MSB在左邊,甚至在中間字節endian硬件上,順便說一下,你的輸入溢出了 – rsaxvc 2012-01-10 02:01:21

+0

這優化爲:output = 0;輸入是8位uchar,當用0x00fff000掩碼時變爲0. >> 3仍然爲零。&0x00000fff仍然爲零。 – rsaxvc 2012-01-10 02:03:52

2

這隻得到你想要的位然後把它們移到右邊。這是@rsaxvc的相反方法。

output = (input & 28) >> 2;