如何高效把一字节的位对换, bit0和bit7,bit1和bit6,以此类推.
#include<stdio.h> #include<stdlib.h> //异或法 unsigned char byteReverse(unsigned char val) { int i; for (i = 0; i < 4; i++) { if (((val &(1 << i)) >> i) ^ ((val & (1 << (7 - i))) >> (7 - i))) val ^= (1 << i) | (1 << (7 - i)); } return val; } //移位法: unsigned char byteReverse1(unsigned char value) { unsigned char a = 0, b = 0, c = 0; for (int i=0;i<4;i++) { a = value&(0x80>>i); b = value&(0x01 << i); c = c + (b << (7 - 2 * i)) + (a >> (7 - 2 * i)); } return c; } //如用C语言,“蝶形交换”最好 unsigned char byteReverse2(unsigned char a) { a = (a << 4) | (a >> 4); a = ((a << 2) & 0xcc) | ((a >> 2) & 0x33); a = ((a << 1) & 0xaa) | ((a >> 1) & 0x55); return a; } //蝶形交换,下面三句顺序随意 unsigned char byteReverse3(unsigned char a) { a = ((a << 4) & 0xf0) | ((a >> 4) & 0x0f); a = ((a << 2) & 0xcc) | ((a >> 2) & 0x33); a = ((a << 1) & 0xaa) | ((a >> 1) & 0x55); return a; } //还是觉得查表简单点: unsigned char byteReverse4(unsigned char dat) { const unsigned char table[16] = { 0, 0x08, 0x04, 0x0c, 0x02, 0x0a, 0x06, 0x0e, 0x01, 0x09, 0x05, 0x0d, 0x03, 0x0b, 0x07, 0x0f }; dat = table[(dat & 0xf0) >> 4] | (table[dat & 0x0f] << 4); return dat; } unsigned char byteReverse5(unsigned char data) { unsigned char ret = 0; for (unsigned char i = 0; i< 8; i++) { ret <<= 1; if (data & 0x01) { ++ret; } data >>= 1; } return ret; } unsigned char byteReverse6(unsigned char val) { unsigned char dat_b, i; dat_b = 0x00; for (i = 0; i <= 7; i++) { dat_b = dat_b | ((val >> i) & 0x01); if (i == 7)break; dat_b = dat_b << 1; } val = dat_b; return val; } void byteReverse7(unsigned char tar, unsigned char *pdata) { unsigned char temp1 = (tar & 0x80) >> 7; unsigned char temp2 = (tar & 0x40) >> 5; unsigned char temp3 = (tar & 0x20) >> 3; unsigned char temp4 = (tar & 0x10) >> 1; unsigned char temp5 = (tar & 0x08) << 1; unsigned char temp6 = (tar & 0x04) << 3; unsigned char temp7 = (tar & 0x02) << 5; unsigned char temp8 = (tar & 0x01) << 7; *pdata = (temp1) | (temp2) | (temp3) | (temp4) | (temp5) | (temp6) | (temp7) | (temp8); } //有问题 const unsigned char jh_tab[8] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }; unsigned char byteReverse8(unsigned char in_data) { unsigned char i; unsigned char aa[8]; unsigned char back_data = 0; for (i = 0; i< 8; i++) { aa[i] = in_data & jh_tab[i]; } aa[0] = aa[0] << 7; aa[1] = aa[1] << 5; aa[2] = aa[2] << 3; aa[3] = aa[3] << 1; aa[7] = aa[7] >> 7; aa[6] = aa[6] >> 5; aa[5] = aa[5] >> 3; aa[4] = aa[4] >> 1; for (i = 0; i< 8; i++) { back_data = back_data + aa; } back_data = back_data; return back_data; } void byteReverse9() { unsigned char c = 0x20; unsigned char b = 0; char i; unsigned char P1 = c; unsigned char P2 = b; for (i = 0; i< 8; i++) { b <<= 1; b += c & 0x01; c >>= 1; P1 = c; P2 = b; } while (1); } void main() { char data = 0x96; printf("@@@@@%x\n", byteReverse1(data)); } /* //汇编法 #ifndef_COMMON_H_ #define_COMMON_H_ #define__SWAP7_0(_short)\ (__extension__({ \ uint8_t __result = (uint8_t)(_short); \ __asm__ __volatile__ \ ( \ "mov__tmp_reg__,%0" "\n\t" \ "ldir25,8" "\n\t" \ "L_%=:" "lsr__tmp_reg__" "\n\t" \ "rol%0" "\n\t" \ "decr25" "\n\t" \ "brneL_%=" "\n\t" \ : "=r" (__result) \ : "0" (__result) \ : "memory" \ ); \ __result; \ })) #defineSWAP7_0(_short)__SWAP7_0((uint8_t)(_short)) #endif int main(void) { char i; i = 0b01100111; i = SWAP7_0(i); PORTB = i; } */
如何高效把一字节的位对换, bit0和bit7,bit1和bit6,以此类推.的更多相关文章
- 一个字 word 是16位, 一个字由两个字节组成 , 字节=byte ,一个字节8位, 位=bit 如果没有特殊说明kb 就是指 k*bit
一个字 word 是16位, 一个字由两个字节组成 , 字节=byte,,一个字节8位, 位=bit 如果没有特殊说明kb 就是指 k*bit kbyte= k*byte
- Byte字节与位
位(bit)字节(byte)一字节是8位所以2Byte是16位二进制
- Bytes和bits的区别(字节和位的区别)
基本概念 Bit意为“位”或“比特”,是计算机运算的基础,属于二进制的范畴: Byte意为“字节”,是计算机文件大小的基本计算单位: 这两者应用的场合不同.通常用bit来作数据传输的单位,因为物理层, ...
- 字节、位、bit、byte、KB、B、字符之间的关系
一.bit 位bit就是位,也叫比特位,是计算机表示数据最小的单位,例如 1b ,2b,3b..... 说白了就是0或者1:计算机内存中的存储都是01这两个东西. 二.byte 字节byte就是字节 ...
- 高效判断奇偶性,利用位运算符&
这种位运算判断奇偶性,在程序和数据库里面都是可以用的 public static bool isOdd(i) { return (i&1)!=0 } 最小奇数是:1 最小偶数是:0 所 ...
- 32位和64位系统区别及int字节数
理论上来讲 我觉得数据类型的字节数应该是由CPU决定的,但是实际上主要由编译器决定(占多少位由编译器在编译期间说了算). 常用数据类型对应字节数 可用如sizeof(char),sizeof(ch ...
- [转]32位和64位系统区别及int字节数
一)64位系统和32位有什么区别? 1.64bit CPU拥有更大的寻址能力,最大支持到16GB内存,而32bit只支持4G内存 2.64位CPU一次可提取64位数据,比32位提高了一倍,理论上性能会 ...
- C++:基础篇-32位和64位系统区别及字节数
今儿面试了一个刚刚毕业的,但是不知道一个int.long.double这几个都是多少位,我给你们总结一下哈: 常用数据类型对应字节数 可用如sizeof(char),sizeof(char*)等得出 ...
- JAVA基础1——字节&位运算
占用字节数 & 取值范围 Java一共有8种基本数据类型(原始数据类型): 类型 存储要求 范围(包含) 默认值 包装类 int 4字节(32位) -2^31~ 2^31-1 0 Intege ...
随机推荐
- MFC+WinPcap编写一个嗅探器之七(协议)
这一节是本系列教程的结尾了,内容也比较简单,主要是对网络协议进行分析,其实学过计算机网络的同学完全可以略过 在整个项目中需要有一个头文件存放各层协议的头部定义,我把它们放在了head.h中,这个头文件 ...
- (转)看懂UML类图
转自:http://design-patterns.readthedocs.io/zh_CN/latest/read_uml.html 这里不会将UML的各种元素都提到,我只想讲讲类图中各个类之间的关 ...
- 在LINUX环境下定时执行php脚本
1. 使用Crontab定时执行linux环境下的php脚本文件 Cron,它是一个linux下的定时执行工具.根用户以外的用户可以使用 crontab 工具来配置 cron 任务.所有用户定义的 c ...
- FGPA 中的计数器Verilog语言(时钟分频器)
在quartusII8.0中为ALTERAFPGA设置一个分频器(计数器) 输入时钟48Mhz 输出时钟9600HZ /* 实验名称: 计数器 ** 程序功能: 将48Mhz的时钟分频为9600Hz ...
- dSploitzANTI渗透教程之安装zANTI工具
dSploitzANTI渗透教程之安装zANTI工具 Dsploit/zANTI基础知识 zANTI是一款Android平台下的渗透测试工具,支持嗅探已连接的网络.支持中间人攻击测试.端口扫描.Coo ...
- 学习Git操作的好资源
网上资源很多,极大的方便了我们学习新东西. 今天找到了几个简单明了的Git教程,用以备录共享. Learn Git Branching http://pcottle.github.io/learnG ...
- android 单位 什么是屏幕密度?
韩梦飞沙 韩亚飞 313134555@qq.com yue31313 han_meng_fei_sha sp dp px in in 表示英寸, 是屏幕的物理尺寸.1英寸是2.54厘米. dp ...
- bzoj1402 Ticket to Ride 斯坦纳树 + 状压dp
给定\(n\)个点,\(m\)条边的带权无向图 选出一些边,使得\(4\)对点之间可达,询问权值最小为多少 \(n \leqslant 30, m \leqslant 1000\) 首先看数据范围,\ ...
- [BZOJ3638 && BZOJ3272]带修区间不相交最大K子段和(线段树模拟费用流)
https://www.cnblogs.com/DaD3zZ-Beyonder/p/5634149.html k可重区间集问题有两种建图方式,可能这一种才可以被线段树优化. 换个角度看,这也是一个类似 ...
- LOJ.114.K大异或和(线性基)
题目链接 如何求线性基中第K小的异或和?好像不太好做. 如果我们在线性基内部Xor一下,使得从高到低位枚举时,选base[i]一定比不选base[i]大(存在base[i]). 这可以重构一下线性基, ...