2014-01-22 67 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