• 如何高效把一字节的位对换, 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
    ", 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" "
    	"       
            "ldir25,8"          "
    	"       
            "L_%=:" "lsr__tmp_reg__"    "
    	"       
            "rol%0"             "
    	"       
            "decr25"            "
    	"       
            "brneL_%="           "
    	"       
            : "=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;
    }
    */
    

      

  • 相关阅读:
    终于成功发布我的博客园处女贴,不过,真的颇费周章,两个htmleditor都非常不好用~~
    全文本代码着色(带源码和示例)
    BlogBench Ver 1.0 发布
    [在windows上使用Unix工具]cygwin
    Linux下压缩与解压
    Linux设置界面或命令行启动
    perl模块安装
    Linux下patch的制作和应用
    TAR命令参数详解
    在windows上使用Sysinternals工具
  • 原文地址:https://www.cnblogs.com/timssd/p/4072679.html
Copyright © 2020-2023  润新知