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);
}
答案 0 :(得分:3)
当您拨打setBit
和clearBit
时,您正在将c1
的副本传递给这些功能。因此,c1
中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);
(但是,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;
}