2010-10-14 31 views
3
int x = 2; 

x = rotateInt('L', x, 1); // should return 4 

x = rotateInt('R', x, 3); // should return 64 

这里是代码,有人可以检查它,让我知道错误是什么?位移C

编译成功,但它执行时说Segmentation Fault

int rotateInt(char direction, unsigned int x, int y) 
{ 
    int i; 

    for(i = 0; i < y; i++) 
    { 

    if(direction == 'R') 
    { 
     if((x & 1) == 1) 
     { 
     x = x >> 1; 
     x = (x^128);  
     } 
     else  
     x = x >> 1; 
    } 
    else if(direction == 'L') 
    { 
     if((x & 128) == 1) 
     { 
     x = x << 1; 
     x = (x^1);  
     } 
     else 
     x = x << 1; 
    } 
    } 
    return x; 
} 
+3

如果你已经完成了10分钟前的相关问题http://stackoverflow.com/questions/3928659/rotating-bits-of-any-integer-in-c你可能想在移动之前接受一个答案上。 – Dusty 2010-10-14 00:20:48

回答

1

我在我的电脑上试过(MacBookPro/Core2Duo),它工作。顺便说一下,你的目标架构是什么?当您使用C运算符“>>”和“< <”时,一些(许多)处理器执行旋转而不是轮班。

+0

我在一台linux机器上执行这个程序,它由我的教师.. – Tim 2010-10-14 00:35:01

+0

好吧,所以我asmume它是一个英特尔机器,它不旋转(至少它不是英特尔Core2Duo的情况下)。然而它在整数旋转的情况下(即“0xff00 >> 16 = 0”但是“0xff00 >> 40 = 0xff”)掩盖了参数0xff。 – 2010-10-14 00:58:19

+0

为'<<' and '>>运算符执行实际位旋转而不是纯移位的编译器将不符合规范。在运营商的定义中我没有看到任何回旋余地。他们正在转变,而不是旋转,并从语言的黎明开始。见C99,第6.5.7节它说:“E1 << E2'的结果是'E1'左移'E2'位的位置;空出的位用零填充。它接着以血腥的细节描述定义行为的界限。右移的描述相似,但边界略有不同。 – RBerteig 2010-10-14 00:59:12

9

现在开始珩磨您的调试技巧。如果你想成为任何形式的工程师,你需要编写一些多样的程序,因此将调试你的一生。

开始调试的一种简单方法是将打印语句放入代码中,使其在死前有多远。我建议你从隔离错误开始。

+0

它只能显示分段错误,就是这样。 – Tim 2010-10-14 00:40:10

+0

这意味着它在第一个'print'语句之前崩溃了。提前移动打印语句并重试。重复,直到你知道哪一行导致段错误 – Josh 2010-10-14 00:49:12

+1

@Josh,这正是我要说的,谢谢。不要忘记在你的printf语句中放入\ n来刷新流。 – 2010-10-14 00:51:17

2

不能确定的赛格故障,但我认为

if((x & 128) == 1) 

应该

if((x & 128) == 128) 

或只是

if(x & 128) 
0

当您使用^你不意味着或运营商|