2014-01-22 68 views
6

我想通過'n'位旋轉無符號字符。但是我沒有得到理想的結果。這是我的代碼n位無符號字符的旋轉

void left_rotate(unsigned char a, int no){ 
     // no - number of times to rotate 
     printf("%d\n", ((a << no) | (a >> (8-no)))); 
} 

我如下

unsigned char a = 'A'; 
left_rotate(a, 2); 

調用從郵件這個功能我希望下面的輸出

//'A' = 65 = 01000001 
// I am rotating in left direction by two times 
// a << 2 = 00000100 
// a >> 6 = 00000001 
(00000100 | 00000001 = 00000101 = 5 in decimal) 

但我得到了一個不同的輸出

// The output in my screen = 100000101 = 261 in decimal 

怎麼辦MSB中有1個蠕變?我使用一個無符號字符作爲數據類型。所以它不應該超過8位。有人可以解釋這個嗎?

由於

CHID

+0

您正在轉移(或通過)簽名類型('char')的符號位。這是**未定義的行爲**。改用'unsigned char'。 – WhozCraig

+0

@WhozCraig他在哪裏轉移簽名的「char」? – 2014-01-22 17:23:43

+0

@ H2CO3在我的咖啡剝奪智力霧頭。謝謝你保持誠實,先生= P – WhozCraig

回答

10

由於<<促進其參數unsigned int,需要屏蔽掉該移位結果的高位:

printf("%d\n", (((a << no) & 0xFF) | (a >> (8-no)))); 

Demo on ideone(打印5)。

+2

我希望我可以更新*所有*你的答案只爲你的頭像圖片;一個rrod。這是*傑出*。唉,無論如何,這很容易得到讚揚。 – WhozCraig

+0

謝謝你們的答案 – CHID