注册 登录
编程论坛 C++教室

[求助]请问怎么实现8位数据对称反转。例:10100000b变为0000101b

Xuan 发布于 2007-11-08 21:09, 895 次点击
我是初学C++的,哪位帮我实现下这个啊。谢谢了,是用堆栈吗
5 回复
#2
succubus2007-11-08 22:10
unsigned char revBitsInByte(unsigned char x)
{
x = (x & 0x55) << 1 | (x & 0xAA) >> 1;
x = (x & 0x33) << 2 | (x & 0xCC) >> 2;
x = (x & 0x0F) << 4 | (x & 0xF0) >> 4;
return x;
}
#3
dreamhunter2007-11-09 17:16
楼上的代码不是很看得懂,能解释一下么?谢谢了
#4
succubus2007-11-09 22:15

开始x(ai(0<=i<8)代表x中的一位): a7 a6 a5 a4 a3 a2 a1 a0

x & 0x55即x & 01010101b后: 0 a6 0 a4 0 a2 0 a0
(x & 0x55) << 1后: a6 0 a4 0 a2 0 a0 0

x & 0xAA即x & 10101010b后: a7 0 a5 0 a3 0 a1 0
(x & 0xAA) >> 1后: 0 a7 0 a5 0 a3 0 a1

(x & 0x55) << 1 | (x & 0xAA) >> 1后 a6 a7 a4 a5 a2 a3 a0 a1

x = (x & 0x55) << 1 | (x & 0xAA) >> 1;后x变成a6 a7 a4 a5 a2 a3 a0 a1
之后同理

x = (x & 0x33) << 2 | (x & 0xCC) >> 2;后x变成a4 a5 a6 a7 a0 a1 a2 a3
x = (x & 0x0F) << 4 | (x & 0xF0) >> 4;后x变成a0 a1 a2 a3 a4 a5 a6 a7

反转完毕

#5
csmenglei9512007-11-09 22:32

用递归然后回溯也行

#6
dicky36512007-11-09 23:01
以下是引用succubus在2007-11-8 22:10:35的发言:
unsigned char revBitsInByte(unsigned char x)
{
x = (x & 0x55) << 1 | (x & 0xAA) >> 1;
x = (x & 0x33) << 2 | (x & 0xCC) >> 2;
x = (x & 0x0F) << 4 | (x & 0xF0) >> 4;
return x;
}

好算法,用位与方式,比用递归好,虽然效果一样,但是如果讲及算法效率的话,这种比递归高很多

1