2010-10-14 36 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

當您使用^你不意味着或運營商|