博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
用位运算反转一个字节
阅读量:5265 次
发布时间:2019-06-14

本文共 1063 字,大约阅读时间需要 3 分钟。

刚在网上看到一个网友的位运算反转一个字节的帖子,贴过来学习积累啊...上代码: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=abcdefghc & 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.

 

转载于:https://www.cnblogs.com/leijiangtao/p/4517252.html

你可能感兴趣的文章
NPOI处理Word文本中上下角标
查看>>
Android笔记 Handler
查看>>
如何阅读大型前端开源项目的源码(转)
查看>>
java.util.Arrays类详解
查看>>
idea搭建tocmat
查看>>
NYOJ-626-intersection set(二分查找)
查看>>
项目管理之路(1):初步踏入项目管理
查看>>
Java 中 静态方法与非静态方法的区别
查看>>
echarts饼图显示百分比
查看>>
JMS消息
查看>>
Jenkins+ProGet+Windows Batch搭建全自动的内部包(NuGet)打包和推送及管理平台
查看>>
php上传文件及头像预览
查看>>
大四java实习生的一些经历
查看>>
线程池的概念
查看>>
Oracle_Statspack性能诊断工具
查看>>
转获取sql维护的表关系
查看>>
Java 序列化
查看>>
Java 时间处理实例
查看>>
Java 多线程编程
查看>>
Java 数组实例
查看>>