#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,以此类推.的更多相关文章

  1. 一个字 word 是16位, 一个字由两个字节组成 , 字节=byte ,一个字节8位, 位=bit 如果没有特殊说明kb 就是指 k*bit

    一个字 word 是16位, 一个字由两个字节组成 , 字节=byte,,一个字节8位, 位=bit 如果没有特殊说明kb 就是指 k*bit kbyte= k*byte

  2. Byte字节与位

    位(bit)字节(byte)一字节是8位所以2Byte是16位二进制

  3. Bytes和bits的区别(字节和位的区别)

    基本概念 Bit意为“位”或“比特”,是计算机运算的基础,属于二进制的范畴: Byte意为“字节”,是计算机文件大小的基本计算单位: 这两者应用的场合不同.通常用bit来作数据传输的单位,因为物理层, ...

  4. 字节、位、bit、byte、KB、B、字符之间的关系

    一.bit 位bit就是位,也叫比特位,是计算机表示数据最小的单位,例如 1b ,2b,3b..... 说白了就是0或者1:计算机内存中的存储都是01这两个东西. 二.byte 字节byte就是字节 ...

  5. 高效判断奇偶性,利用位运算符&

    这种位运算判断奇偶性,在程序和数据库里面都是可以用的 public static bool isOdd(i) { return (i&1)!=0 } 最小奇数是:1   最小偶数是:0   所 ...

  6. 32位和64位系统区别及int字节数

    理论上来讲 我觉得数据类型的字节数应该是由CPU决定的,但是实际上主要由编译器决定(占多少位由编译器在编译期间说了算). 常用数据类型对应字节数   可用如sizeof(char),sizeof(ch ...

  7. [转]32位和64位系统区别及int字节数

    一)64位系统和32位有什么区别? 1.64bit CPU拥有更大的寻址能力,最大支持到16GB内存,而32bit只支持4G内存 2.64位CPU一次可提取64位数据,比32位提高了一倍,理论上性能会 ...

  8. C++:基础篇-32位和64位系统区别及字节数

    今儿面试了一个刚刚毕业的,但是不知道一个int.long.double这几个都是多少位,我给你们总结一下哈: 常用数据类型对应字节数  可用如sizeof(char),sizeof(char*)等得出 ...

  9. JAVA基础1——字节&位运算

    占用字节数 & 取值范围 Java一共有8种基本数据类型(原始数据类型): 类型 存储要求 范围(包含) 默认值 包装类 int 4字节(32位) -2^31~ 2^31-1 0 Intege ...

随机推荐

  1. 面试题49:把字符串转换成整数(atoi)

    需要考虑的问题都已在程序中注释 bool isValid; int StrToInt(const char* str) { isValid = false; //不合法情形1:空指针 if (str ...

  2. Ubuntu18.04 n卡配置

    一.背景 最近安装了ubutnu18.04后,安装系统后重启卡住,强制关机重启后,又在开机界面紫屏卡住,上网搜索后发现是n卡的驱动问题,使用以下方法安装驱动后成功解决该问题. 二.解决方法 1.进入恢 ...

  3. IOS常用第三方类库

    开发几个常用的开源类库及下载地址: 1.json json编码解码 2.GTMBase64 base64编码解码 3.TouchXML xml解析 4.SFHFKeychainUtils 安全保存用户 ...

  4. pyinstaller 打包错误集锦

    最近在用 pyinstaller 打包项目的时候遇到如下错误: RecursionError: maximum recursion depth exceeded 解决方案 执行 pyinstaller ...

  5. android 定时, 延时 任务

    韩梦飞沙  韩亚飞  313134555@qq.com  yue31313  han_meng_fei_sha 倒计时类  用  倒计时定时器CountDownTimer 延迟类 CountDownT ...

  6. Qt Quick快速入门之qml布局

    Qml里面布局主要有两种,锚点布局.Grid布局. 锚点布局使用anchors附件属性将一个元素的边定位到另一个元素的边,从而确定元素的位置和大小.下面是示例 import QtQuick 2.3 i ...

  7. c++ 时间相关的类型

    关于时间转换可以参考以下博客: https://www.jianshu.com/p/80de04b41c31 https://www.cnblogs.com/qicosmos/p/3642712.ht ...

  8. Codeforces Round #355 (Div. 2) C. Vanya and Label 水题

    C. Vanya and Label 题目连接: http://www.codeforces.com/contest/677/problem/C Description While walking d ...

  9. JAVA读入挂

    队友扒的uwi的读入挂,非常强,再也不用担心java比C++慢了-- import java.util.*; import java.math.*; import java.io.ByteArrayI ...

  10. UVALive 4867 Maximum Square 贪心

    E - Maximum Square Time Limit:4500MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit ...