用位运算反转一个字节

unsigned char reverse8( unsigned char c )
{
     c = ( c & 0x55 ) << 1 | ( c & 0xAA ) >> 1;
     c = ( c & 0x33 ) << 2 | ( c & 0xCC ) >> 2;
     c = ( c & 0x0F ) << 4 | ( c & 0xF0 ) >> 4;
     return c;
}
分析:

它的算法是这样的: 首先是2位2位为一组,交换前一半和后一半。再4位4位为一组,交换前一半和后一半。再8位为一组,交换前一半和后一半。举个例子来看,
将1 2 3 4 5 6 7 8 反转。
(1)2个2个为一组,交换前一半和后一半, 变成:   2 1 4 3 6 5 8 7
(2)4个4个为一组,交换前一半和后一半, 变成:   4 3 2 1 8 7 6 5
(3)再8个为一组,交换前一半和后一半, 变成:   8 7 6 5 4 3 2 1
反转成功。
这样的算法本来很是简单,很容易用数学归纳法证明其正确。这函数, 巧妙就巧妙在作了并行计算,分组,它一次就计算完了。

先看第一个语句。c = ( c & 0x55) << 1 | ( c & 0xAA ) >> 1; 
0x55其实就是01010101, 0xAA就是10101010
假设 c=abcdefgh
c & 0x55 = 0b0d0f0h,     c & 0xAA = a0c0e0g0
跟着,前者左移一位, b0d0f0h0, 后者右移一位, 0a0c0e0g, 再一个|运算,就两位两位交换了位置。
想象一下,你有一个长纸条,分成一格一格,每格写一个字,假如你将纸条每隔一格剪一个小洞,滑一格,覆盖在原来的纸条上,你就会看到两个两个字交换了位置。
(注: |运算可以换成+运算,想一想为什么?其实狠简单啊,一个数和0相加结果还是那个数啊...是这样的吧?)

第二个语句。 c = ( c & 0x33 ) << 2 | ( c & 0xCC ) >> 2;
0x33 = 00110011, 0xCC=11001100。 

第三个语句。c = ( c & 0x0F ) << 4 | ( c & 0xF0 ) >> 4;
0x0f = 00001111, 0xF0=11110000.

*******************************************************************

用abcdefgh来演示:

第一步c = ( c & 0x55) << 1 | ( c & 0xAA ) >> 1;   变成 b a d c f e h g

第二步c = ( c & 0x33 ) << 2 | ( c & 0xCC ) >> 2;  变成 d c b a h g f e

第三步c = ( c & 0x0F ) << 4 | ( c & 0xF0 ) >> 4;   变成 h g f e d c b a    

Done!(有点像字符串移位,翻转三次,思想是类似的)

### 关于C语言实现字节数据位反转 在C语言中,可以通过按位运算来实现字节数据的位反转。具体来说,对于给定的一个字节(8位),需要将其每一位按照相反顺序重新排列。这种方法通常涉及循环和移位操作。 以下是基于已有引用内容以及专业知识构建的一种解决方案: #### 解决方案描述 通过逐位提取输入字节中的每一位,并将这些位依次放置到一个新的变量中,从而完成字节数据的位反转过程[^1]。此方法利用了逻辑右移 (`>>`) 和左移 (`<<`) 运算符,配合掩码 `&` 来获取特定位置上的比特值。 下面提供了一个具体的代码示例用于演示这一功能: ```c #include <stdio.h> unsigned char reverse_bits(unsigned char byte) { unsigned char result = 0; int i; for (i = 0; i < 8; ++i) { if ((byte & (1 << (7 - i))) != 0) { result |= (1 << i); } } return result; } int main() { unsigned char input = 0b10101010; // Example Input Byte: Binary Representation of 'A' printf("Original : %d\n", input); unsigned char reversed = reverse_bits(input); printf("Reversed : %d\n", reversed); return 0; } ``` 上述代码定义了一个名为 `reverse_bits` 的函数,该函数接受一个无符号字符类型的参数并返回经过位翻转后的结果。它内部采用了一次遍历的方式逐一检查原字节各比特的状态并将它们相应地设置到目标字节上[^2]。 另外值得注意的是,在某些情况下可能还需要考虑补全高位的情况或者处理其他边界条件等问题[^3]。 #### 结论 综上所述,我们已经展示了如何使用标准库之外的基础技术手段去解决这个问题——即通过对每一个单独的数据单元执行必要的计算步骤达成最终目的。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值