标题: 请教个低级问题(一个二进制数用什么运算能让高位和低位反过来) [打印本页]

作者: dzbj    时间: 2018-11-5 20:18
标题: 请教个低级问题(一个二进制数用什么运算能让高位和低位反过来)
一个二进制数 用什么运算能让高位和低位反过来

比如
原来的数是 0000 0001 目标是1000 0000
原来的数是 0000 1001 目标是1001 0000
原来的数是 0000 0111 目标是1110 0000
原来的数是 0110 0001 目标是1000 0110

以此类推..............................

不是移位 是让原来的最低位成最高位

作者: HC6800-ES-V2.0    时间: 2018-11-6 07:28
还是移位嘛,只不过要移八次。还可以位操作,这个复杂点——逐个位取出值来,再赋值回相应的位。
作者: liujiep    时间: 2018-11-6 08:42
高位右移,低位左移
作者: zl2168    时间: 2018-11-6 08:46
逻辑运算。例如汇编语言。1. 循环左移一次: RL  A; 2. 高低四位交换:SWAP  A; 3. 循环右移四次:RR   A; 4. 要用几条指令才能实现。
作者: xuyaqi    时间: 2018-11-6 10:11
给个例程:
#include "reg51.h"

char duidiao(char a)
{
  char b=0;

  if((a&0x01)!=0){b=b|0x80;}
        if((a&0x02)!=0){b=b|0x40;}
        if((a&0x04)!=0){b=b|0x20;}
        if((a&0x08)!=0){b=b|0x10;}
       
        if((a&0x10)!=0){b=b|0x08;}
        if((a&0x20)!=0){b=b|0x04;}
        if((a&0x40)!=0){b=b|0x02;}
        if((a&0x80)!=0){b=b|0x01;}
       
        return b;
}
main()
{
       
        while(1)
        {       
                char b;
               
                b=duidiao(0x61);
       
        }
}


作者: dzbj    时间: 2018-11-6 10:14
在此一并感谢沙发 板凳 地板的回复

请教一下 除了每位都位移一次外 有更简洁的算法吗
作者: zbm99    时间: 2018-11-6 10:20
目标是1000 0000
作者: 蒲扇轻摇    时间: 2018-11-6 10:25
直接与运算,与完保存高位数据和地位数据~再互换
作者: cuihaodianzi    时间: 2018-11-6 10:28
简单粗暴
#include <reg52.h>
unsigned int temp = 0x61;  //  0110 0001  -> 1000 0110    0x86
unsigned int temp0,temp1,temp2,temp3,temp4,temp5,temp6,temp7;
void main()
{       
        temp7 =   (temp & 0x01) << 7 ;
        temp6 =                (temp & 0x02) << 5 ;  
        temp5 =                (temp & 0x04) << 3 ;  
        temp4 =                (temp & 0x08) << 1 ;  
        temp3 =                (temp & 0x10) >> 1 ;  
        temp2 =                (temp & 0x20) >> 3 ;
        temp1 =   (temp & 0x40) >> 5 ;
        temp0 =   (temp & 0x80) >> 7    ;


        temp = (temp0 | temp1 | temp2 | temp3 | temp4 | temp5 | temp6 | temp7);


        while(1)
        {
                P1 = temp  ;
        }
       
}






20181106102702.jpg (72.86 KB, 下载次数: 68)

20181106102702.jpg

作者: heema    时间: 2018-11-6 10:38
你是用C语言吗,还是用位操作吧,写一个函数。
作者: mengzhixinheng    时间: 2018-11-6 10:47
N|=(X&0x01<<i)<<(7-i);。N为目标数,X为原数,i=(0-7).
作者: dzbj    时间: 2018-11-6 11:22
xuyaqi 发表于 2018-11-6 10:11
给个例程:
#include "reg51.h"

感谢回复

我觉得您的方法消耗的时间会比偏多
作者: dzbj    时间: 2018-11-6 11:24
cuihaodianzi 发表于 2018-11-6 10:28
简单粗暴
#include
unsigned int temp = 0x61;  //  0110 0001  -> 1000 0110    0x86

谢谢

你用的是多少频率 12M么 这样做一次 消耗多少时间
作者: dzbj    时间: 2018-11-6 11:25
mengzhixinheng 发表于 2018-11-6 10:47
N|=(X&0x01

不明觉厉 我好好想想

请教 这样做 同样时钟频率下 比前面的方法耗时少么 我用c
作者: cuihaodianzi    时间: 2018-11-6 11:52
mengzhixinheng 发表于 2018-11-6 10:47
N|=(X&0x01

按照这个操作,貌似所有的“位” 都在最高位了,除了 0000 0000,的结果是 0,
其他的结果应该都是 1000 0000 吧 ?
作者: cuihaodianzi    时间: 2018-11-6 12:07
受到 11# 启发,改了一个

#include <reg52.h>
unsigned int N;
unsigned char i,X = 0xa1;
void main (void)
{
        for(i = 0;i < 8;i++)
        {
                N|=( X & (0x01 << i) ) << (15 - (2 * i) );//N为目标数,X为原数,i=(0-7).       
        }
       
        N >>= 8;


  while(1)
  {
    P1 =N;
  }  
}

作者: 不二的天歇    时间: 2018-11-6 12:39
高右低左
作者: mengzhixinheng    时间: 2018-11-6 12:56
dzbj 发表于 2018-11-6 11:25
不明觉厉 我好好想想

请教 这样做 同样时钟频率下 比前面的方法耗时少么 我用c

你要做什么,时间要求很高吗?8位数据的加减移位是很快的了,不然就只有用汇编了
作者: mengzhixinheng    时间: 2018-11-6 12:58
cuihaodianzi 发表于 2018-11-6 11:52
按照这个操作,貌似所有的“位” 都在最高位了,除了 0000 0000,的结果是 0,
其他的结果应该都是 1000 ...

7-i   ???????????????
作者: 成虎    时间: 2018-11-6 13:13
逻辑运算。例如汇编语言。1. 循环左移一次: RL  A; 2. 高低四位交换:SWAP  A; 3. 循环右移四次:RR   A; 4. 要用几条指令才能实现。
作者: sxhwdz    时间: 2018-11-6 13:33
我给你换个思路看看,不循环,一条语句:
char code c[]=
{
        0x0,0x8,0x4,0xc,0x2,0xa,0x6,0xe,
        0x1,0x9,0x5,0xd,0x3,0xb,0x7,0xf,
};


void main(void)
{
   char a;
   a=0x01;

   a=c[a%0x0f]<<4+c[a>>4];

   while(1);
}
作者: 51heidianzixy    时间: 2018-11-6 14:02
除以16,用商+16*余数
作者: 布偶猫    时间: 2018-11-6 14:14
高位右移,低位左移
作者: cuihaodianzi    时间: 2018-11-6 15:52
mengzhixinheng 发表于 2018-11-6 12:58
7-i   ???????????????

xxxx xxxx =(X&0x01<<i)<<(7-i);
只要 xxxx xxxx != 0;
i = 0 ,7 - i = 7 : 0000 0001 << 7    ->  1000 0000
i = 1 ,7 - i = 6 : 0000 0010 << 6    ->  1000 0000
i = 2 ,7 - i = 5 : 0000 0100 << 5    ->  1000 0000
i = 3 ,7 - i = 4 : 0000 1000 << 4    ->  1000 0000
i = 4 ,7 - i = 3 : 0001 0000 << 3    ->  1000 0000
i = 5 ,7 - i = 2 : 0010 0000 << 2    ->  1000 0000
i = 6 ,7 - i = 1 : 0100 0000 << 1    ->  1000 0000
i = 7 ,7 - i = 0 : 1000 0000            ->  1000 0000
都是 0x80 啊
(X&0x01<<i)<<(7-i)   先左移 i ,再左移 7 - i ,不就是 左移 7位 吗 ?

作者: cuihaodianzi    时间: 2018-11-6 16:07
dzbj 发表于 2018-11-6 11:24
谢谢

你用的是多少频率 12M么 这样做一次 消耗多少时间

直接用移位时:  0.000496 - 0.000437 = 0.000059 S for 循环操作:  0.001383 - 0.000437 = 0.000946 S
应该是 for 循环语句自身浪费了太多时间





20181106155802.jpg (108.54 KB, 下载次数: 61)

20181106155802.jpg

20181106155842.jpg (80.68 KB, 下载次数: 76)

20181106155842.jpg

20181106160020.jpg (97.87 KB, 下载次数: 61)

20181106160020.jpg

20181106160047.jpg (96.13 KB, 下载次数: 78)

20181106160047.jpg

作者: mengzhixinheng    时间: 2018-11-6 17:37
cuihaodianzi 发表于 2018-11-6 15:52
xxxx xxxx =(X&0x01

确实,谢谢!!!
N|=(X<<i&0x80)>>(7-i);。N为目标数,X为原数,i=(0-7).
作者: mengzhixinheng    时间: 2018-11-6 17:37
mengzhixinheng 发表于 2018-11-6 10:47
N|=(X&0x01

N|=(X<<i&0x80)>>(7-i);。N为目标数,X为原数,i=(0-7).
作者: mengzhixinheng    时间: 2018-11-6 18:29
2
3
N=(N<<4)|(N>>4);
N=((N<<2)&0xcc)|((N>>2)&0x33);  
N=((N<<1)&0xaa)|((N>>1)&0x55);
也可以对调法,不用循环,但是不知道是否节约时间


作者: dzbj    时间: 2018-11-6 20:03
mengzhixinheng 发表于 2018-11-6 12:56
你要做什么,时间要求很高吗?8位数据的加减移位是很快的了,不然就只有用汇编了

倒不是时间的问题 我也能用移位的方法实现 只是方法比较笨 正常思维 想请教前辈们有什么更好的方法 这么简单的位操作就不应该消耗很多时间 简单的程序当然没问题 复杂程序就不好了
作者: dzbj    时间: 2018-11-6 20:06
51heidianzixy 发表于 2018-11-6 14:02
除以16,用商+16*余数

感谢你的回复

做乘除运算比移位和加减耗时多




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1