更改函数中的变量无效

时间:2012-10-06 00:37:46

标签: c loops while-loop

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 个答案:

答案 0 :(得分:3)

当您拨打setBitclearBit时,您正在将c1副本传递给这些功能。因此,c1xor4的值根本不会改变。

替换

 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替换函数就会更有效率。)

答案 1 :(得分:1)

你没有发布你的setbit和clearbit函数,但无论它们做什么,都无法改变调用函数中的c1。您需要传递c1的地址或返回c1的新值。或者你可以只使用C位运算符。而你的整个操作只相当于c1 ^= c2(假设一个字符有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;
}