如何高效把一字节的位对换, 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 ...
随机推荐
- 最短路算法 -- SPFA模板
一.算法步骤 建立一个队列,初始时队列里只有起始点,再建立一个数组记录起始点到所有点的最短路径(该数组的初始值要赋为极大值,该点到它本身的路径赋为0,下面的模板中该数组为dist[]).然后执行松弛操 ...
- HandlerExceptionResolver统一异常处理 返回JSON 和 ModelAndView
统一异常处理类的两种方式一种是前后分离,一种是一整套集合返回指定到指定的错误页面显示错误信息 1.由于前后分离,是统一返回JSON的格式 自定义Exception public class Bussi ...
- python面向对象中类对象、实例对象、类变量、实例变量、类方法、实例方法、静态方法
1. 类对象和实例对象 Python中一切皆对象,Python类本身也是一种对象,类定义完成后,会在当前作用域中定义一个以类名为名字的命名空间.类对象具有以下两种操作: 可以通过“类名()”的方式实例 ...
- Android消息总线的演进之路:用LiveDataBus替代RxBus、EventBus
背景 对于Android系统来说,消息传递是最基本的组件,每一个App内的不同页面,不同组件都在进行消息传递.消息传递既可以用于Android四大组件之间的通信,也可用于异步线程和主线程之间的通信.对 ...
- iOS 11开发教程(九)iOS11数据线连接真机测试
iOS 11开发教程(九)iOS11数据线连接真机测试 在Xcode 7.0之后,苹果公司在开发许可权限上做了很多的改变,在测试App方面取消了一些限制.在Xcode7.0之前的版本,苹果公司只向注册 ...
- MongoDB 进阶
一.MongoDB 复制(副本集) MongoDB复制是将数据同步在多个服务器的过程. 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性. 复制还允 ...
- ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
登录服务器,使用root用户连接mysql时出现错误提示: $ bin/mysql -uroot -p Enter password: ERROR (HY000): Can't connect to ...
- BZOJ 1283 序列 费用流 网络流 线性规划
https://darkbzoj.cf/problem/1283 给出一个长度为N的正整数序列Ci,求一个子序列,使得原序列中任意长度为M的子串中被选出的元素不超过K(K,M<=100) 个,并 ...
- 自顶向下学搜索引擎——北大天网搜索引擎TSE分析及完全注释[1]寻找搜索引擎入口
转自:http://blog.csdn.net/jrckkyy/article/category/402818 由于百度博客http://hi.baidu.com/jrckkyy发表文章字数有限,以后 ...
- Github好用的Python库使用学习日记
开源好用的Python库 Overview 所有内容基本源于下面的两个网站 awesome-python python3官方文档 you-get(命令行操作的媒体下载工具) you-get的git项目 ...