反转一个字节的算法

新手学习Vivado XDMA (1) - 配置详细分析 PCIe 在 Vivado XDMA 中的配置分析。 阅读详情

反转函数:

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个为一组,交换前一半和后一半,变成:
  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, 再一个|运算,就两位两位交换了位置。
想象一下,你有一个长纸条,分成一格一格,每格写一个字,假如你将纸条每隔一格剪一个小洞,滑一格,覆盖在原来的纸条上,你就会看到两个两个字交换了位置。
(注: |运算可以换成+运算,想一想为什么)

转载自:http://blog.chinaunix.net/u/25096/showart_362366.html

 

C/C++实现字节反转算法 在计算机系统中,有两种主要的字节序:大端序(Big Endian)和小端序(Little Endian)。大端序是指在多字节数据中,高位字节存储在低地址,低位字节存储在高地址;在网络通信和跨平台数据传输中,字节序的转换是一个常见的需求。本文将详细介绍在C/C++中实现字节反转算法,并提供相应的源代码示例。通过上述的字节反转函数,我们可以在C/C++中方便地实现字节反转算法。需要注意的是,字节反转的结果依赖于机器的字节序。如果当前机器是小端序的,那么字节反转后的结果将是大端序的; 阅读详情

相关推荐

AI Agent开发第49课-DIFY让AI自动预约排班后发企业微信通知-MongoDb-Redis-企业微信调用

我们的Dify会讲得很透彻,坚持喂饭级教程,从一个基本的AI自动预约客户到自动记录客户的信息再到自动判断下一步如何走全部是AI化的,这是一个真正的AI原生应用,它来自于我的一个大型物业公司用AI自动预约系统中的一部分。我们会使用这个预约流做完整的Dify例子来讲完,因为它太有代表性了。工作流中的控制反转、AI决策下一步怎么走、人为干涉、用户行为判断、外部中间件如Redis,今天我们就要讲到在Dify中调用MongoDB的数据以及企业微信通知来作为预约派单的最后一步了。

打造全国最全的AI Agent开发知识领域的博客 1732

CBC字节翻转攻击介绍 & 例题

CBC字节翻转攻击介绍 & 例题

Emmaaaaa's blog 2341

基于FPGA的人脸识别系统(纯Verilog,有注释)

1、工程用的是Altera的EP4CE10芯片,纯Verilog设计,可以移植到任何FPGA2、ov7725摄像头,VGA显示屏,可以直接烧录,看现象3、所有代码均有注释。4、Quartus II工程可用毕设或者竞赛项目

简单实用算法——字节位序反转

反转一个字节说的是位序反转,别将它和大端转小端混淆了,所谓大端和小端指的是字节序。字节位序反转的实现算法很多,就是看看谁的算法效率更高了。高手不是能写出最美丽的程序而是能写出既美丽同时效率又是最高的程序。如果一个人写的程序很美丽,很直观,只能说明该程序员对语言掌握的很好,但是语言毕竟只是工具,真正做事的是计算机,只有对计算机很了解,才能写出效率最高的程序。正如文学家的文笔很多不如花季少女,但是花季少女永远也超越不了时代。

Nasus_GT的博客 1805

反转一个字节 和 判断32位整数二进制中1的个数 的算法(ZZ)

呵呵,好东东,共享,好像有一个是微软的面试题unsigned char reverse8( unsigned char c ){     c = ( c & 0x55 ) > 1;     c = ( c & 0x33 ) > 2;     c = ( c & 0x0F ) > 4;     return c;}unsigned long func(unsi

WINCOL的专栏 1120

用位运算反转一个字节

/++++ 功能:用位运算反转一个字节 参数:INT8U c 一字节 输出:反转字节 例子:1000 0000 → 0000 0001 ----/ typedef unsigned char INT8U; /* Unsigned 8 bit quantity */ INT8U reverse8( INT8U c ) { c = ( c & 0x55 ) << 1 | (

luopeng12345的博客 605

翻转一个字节

unsigned char func( unsigned char c){ static unsigned char sta[16] ={//不多不少的静态数据 0x00,0x08,0x04,0x0C,0x02,0x0A,0x06,0x0E,0x01,0x09,0x05,0x0D,0x03,0x0B,0x07,0x0F }; unsigned char d ...

周平的专栏 804

(ZZ)反转一个字节算法

转自:http://blog.chinaunix.net/u1/51538/showart.php?id=418572 //算法1,查表法,典型的空间换时间,在现代的CPU上,这种算法具有最快的速度。 unsigned char reverse1(unsigned char c) { static unsigned char table[256] = {...

weixin_30924087的博客 170

反转一个字节 和 判断32位整数二进制中1的个数 的算法

反转一个字节 和 判断32位整数二进制中1的个数 的算法 unsigned char reverse8( unsigned char c ){    c = ( c & 0x55 ) > 1;    c = ( c & 0x33 ) > 2;    c = ( c & 0x0F ) > 4;    return c;}unsigned long func(unsigned long x)

todototry的专栏 4608

反转一个字节和判断32位整数二进制中1的个数等算法

  unsigned char reverse8( unsigned char c ){    c = ( c & 0x55 ) > 1;    c = ( c & 0x33 ) > 2;    c = ( c & 0x0F ) > 4;    return c;}unsigned long func(unsigned long x){    x = (x & 0x55555555UL) +

Knocking On The Heaven's Door 3187

(转贴)反转一个字节 和 判断32位整数二进制中1的个数 的算法

unsigned char reverse8( unsigned char c ){    c = ( c & 0x55 ) > 1;    c = ( c & 0x33 ) > 2;    c = ( c & 0x0F ) > 4;    return c;}unsigned long func(unsigned long x){    x = (x & 0x55555555UL) + ((x 

594

(超强)反转一个字节 和 判断32位整数二进制中1的个数 的算法

[code] unsigned char reverse8( unsigned char c ) { c = ( c & 0x55 ) > 1; c = ( c & 0x33 ) > 2; c = ( c & 0x0F ) > 4; return c; } [/code] [code] unsigned long func(unsigned long x) ...

希望的田野 266

位运算复习——字节的奇偶校验和反转一个字节中的二进制位

#include #include /** * 用软件实现字节的奇偶校验 * 返回值:如果这个字节中含有奇数个1,则返回1; * 否则返回0 */ uint8_t parityCheck(uint8_t val) { uint8_t cnt = 0; while (val) { if (val & 0x01)

宁静致远 1566

笔试题--反转一个字节

这道题很古老了,可别将它和大端转小端混淆了,所谓大端和小端指的是字节序,而这里反转一个字节说的是位序,算法更是不胜枚举,说实话都能达到目的,剩余的就是看看谁的效率更高了,基本上这是一个最难的问题,高手不是能写出最美丽的程序而是能写出既美丽同时效率又是最高的程序,如果一个人写的程序很美丽,很直观,只能说明该程序员对语言掌握的很好,但是语言毕竟只是工具,真正做事的是计算机,只有对...

weixin_34378045的博客 99

实现字符串的反转php,PHP字符串反转

1.单字节字符串反转php提供了用于字符串反转的函数strrev()$str = 'abcdef';echo strrev($str);2.对于包含中文的多字节字符串需要用到mb_substr()$str = '字符串反转';function rev($str, $encoding = 'utf-8'){$len = mb_strlen($str, $encoding);$result = '';...

weixin_36431018的博客 183
上一篇: wxWidgets:国际化编程
下一篇: 求32位整数二进制中1的个数
sendltd
博客等级 码龄24年 2粉丝 9原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值