2012-10-06 59 views
0
unsigned char xor4(unsigned char c1, unsigned char c2){ 
    int i = 0; 
    while(i < 8){ 
     if((getBit(c1, i)^getBit(c2, i))) 
      setBit(c1,i); 
     else clearBit(c1, i); 
     i+=2; 
    } 

    return c1; 
} 

上面的代碼被認爲是一個非常簡單的函數來設置每隔一個位在基於與第二字符每隔一個比特的XOR結果的字符。出於某種原因,這根本行不通。該程序似乎只是忽略我的while循環並返回原始函數。在函數更改變量沒有效果

哦,這裏是我的GETBIT,setBit和clearBit功能。

unsigned char getBit(unsigned char c, int n){ 
    return (c & 1<<n) >> n; 
} 

unsigned char clearBit(unsigned char c, int n){ 
    c = c & (~(1<<n)); 
} 

unsigned char setBit(unsigned char c, int n){ 
    `c = c | (1<<n); 
} 
+2

'返回C1^C2;'將是一個更有效的方法照着做。 –

+0

一個重要的問題:究竟是什麼讓你認爲* while循環*不起作用?你怎麼能證實循環實際上工作? –

+0

@ KarolyHorvath的觀點可能有點太微妙。 OP錯誤地認爲while循環沒有執行。一些明智的printfs會驗證它正在執行,但setbit和clearbit調用不會改變c1。 –

回答

1

你沒有發佈你的setbit和clearbit函數,但是他們做的任何事情都不能在調用函數中改變c1。您需要傳遞c1的地址或返回c1的新值。或者你可以使用C位運算符。而你的整個操作只是相當於c1 ^= c2(假設char有8位)。

編輯:鑑於您的編輯,只需分配你的函數的返回值與C1 ...和定勢的setbit和清晰的功能位,他們不返回值,如果你在使用適當的警告設置你的編譯器會告訴你。我做了一些文體上的修改:

/* your getbit works but is needlessly complex */ 
unsigned char getBit(unsigned char c, int n){ 
    return (c >> n) & 1; 

unsigned char clearBit(unsigned char c, int n){ 
    return c & ~(1 << n); 
} 

unsigned char setBit(unsigned char c, int n){ 
    return c | (1 << n); 
} 

unsigned char xor4(unsigned char c1, unsigned char c2){ 
    for(int i = 0; i < 8; i += 2) 
     c1 = (getBit(c1, i)^getBit(c2, i) 
       ? setBit(c1, i); 
       : clearBit(c1, i)); 

    return c1; 
} 

這裏有一個更快的解決方案:

unsigned char xor4(unsigned char c1, unsigned char c2){ 
    return (c1 & 0xAA) | ((c1^c2) & 0x55); 
} 

甚至更​​快:

unsigned char xor4(unsigned char c1, unsigned char c2){ 
    return (c2 & 0x55)^c1; 
} 
+0

謝謝。我已經添加了設置和清除位功能。我還編輯了代碼,因爲那裏存在拼寫錯誤。我不能使用c1^= c2的原因是我不得不每隔一位更換其他位 –

+0

非常感謝。我想我一直在使用Java頭腦的方法編寫C編程 –

+0

@OladunniAbiodun查看我的編輯。這也應該都可以在Java中工作(只需少量語法調整),並且由於相同的原因,代碼將失敗......生成值的函數必須返回這些值,調用者必須將它們分配到某處以使用它們。 –

3

當你調用setBitclearBit,您傳遞副本c1這些功能。因此,xor4中的c1的值完全沒有改變。

更換

if((getBit(c1,i)^getBit(c2,i))) setBit(c1,i); 
else clearBit(c1,i); 

直接設置或清除操作,

if((getBit(c1,i)^getBit(c2,i))) c1 |= (1 << i); 
else c1 &= ~(1 << i); 

(但是,as was pointed out,只是一個簡單的c1^c2更換功能會更有效。)

+0

謝謝你。我不能使用直接設置和清除操作,因爲這是一項任務,我們應該自己編寫設置和清除操作作爲分配的一部分。我已經掌握了這些功能以供參考 –