无符号字符的n位旋转

6

我正在尝试将一个无符号字符向左旋转'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);

I expected the following output

//'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

为什么最高位出现了1?我的数据类型是无符号字符,所以它不应该超过8位。有人能解释一下吗?

谢谢

Chid


你正在移位到(或通过)有符号类型(char)的符号位。这是未定义行为。请改用unsigned char - WhozCraig
@WhozCraig 他在移动一个有符号的 char 吗? - user529758
@H2CO3 在我缺乏咖啡、头脑迷糊的情况下。感谢您让我保持诚实,先生 =P - WhozCraig
@WhozCraig 没问题 :P 事实上,您非常接近了!祝您享用咖啡。 - user529758
@H2CO3 呵呵,不是的。我完全忘记了这个促销活动。巧妙的问题,必须点个赞! - WhozCraig
@WhozCraig 是的,我也在考虑那个问题。说实话,我也没太明白。 - user529758
1个回答

10

由于 << 将其参数提升为 unsigned int,因此需要屏蔽移位结果的高位:

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

在ideone上的演示(输出5)。


2
我希望我能更新你所有的答案,只为了你的头像图片; 一个rrod。那太棒了。遗憾的是,这个答案无论如何都值得点赞。 - WhozCraig
谢谢大家的回答。 - CHID

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接