1
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;
}

上面的代码应该是一个非常简单的函数,它根据与第二个字符中的每隔一个位进行异或的结果来设置一个字符中的每隔一个位。出于某种原因,这根本行不通。该程序似乎只是忽略了我的 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);
}
4

2 回答 2

3

当您调用setBitandclearBit时,您正在将副本传递c1给这些函数。因此c1in的值xor4根本没有改变。

代替

 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);

(但是,正如所指出的那样,仅用简单的函数替换该函数c1 ^ c2会更有效。)

于 2012-10-06T00:40:12.403 回答
1

您没有发布您的 setbit 和 clearbit 函数,但无论它们做什么,都无法更改调用函数中的 c1 。您需要传递 c1 的地址或返回 c1 的新值。或者您可以只使用 C 位运算符。而你的整个操作就相当于c1 ^= c2(假设一个 char 有 8 位)。

编辑:鉴于您的编辑,只需将函数的返回值分配给 c1 ...并修复您的 setbit 和 clear bit 函数...它们不返回值,如果您在编译器中使用正确的警告设置,它会告诉你。我做了一些风格上的改变:

/* 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;
}
于 2012-10-06T00:43:07.190 回答