找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 7872|回复: 29
收起左侧

请教个低级问题(一个二进制数用什么运算能让高位和低位反过来)

  [复制链接]
ID:47286 发表于 2018-11-5 20:18 | 显示全部楼层 |阅读模式
一个二进制数 用什么运算能让高位和低位反过来

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

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

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

使用道具 举报

ID:164602 发表于 2018-11-6 07:28 | 显示全部楼层
还是移位嘛,只不过要移八次。还可以位操作,这个复杂点——逐个位取出值来,再赋值回相应的位。

评分

参与人数 1黑币 +4 收起 理由
dzbj + 4 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:318264 发表于 2018-11-6 08:42 | 显示全部楼层
高位右移,低位左移

评分

参与人数 1黑币 +4 收起 理由
dzbj + 4 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:111634 发表于 2018-11-6 08:46 | 显示全部楼层
逻辑运算。例如汇编语言。1. 循环左移一次: RL  A; 2. 高低四位交换:SWAP  A; 3. 循环右移四次:RR   A; 4. 要用几条指令才能实现。

评分

参与人数 1黑币 +4 收起 理由
dzbj + 4 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:94031 发表于 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);
       
        }
}

评分

参与人数 1黑币 +4 收起 理由
dzbj + 4 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:47286 发表于 2018-11-6 10:14 | 显示全部楼层
在此一并感谢沙发 板凳 地板的回复

请教一下 除了每位都位移一次外 有更简洁的算法吗
回复

使用道具 举报

ID:421547 发表于 2018-11-6 10:20 | 显示全部楼层
目标是1000 0000
回复

使用道具 举报

ID:300089 发表于 2018-11-6 10:25 | 显示全部楼层
直接与运算,与完保存高位数据和地位数据~再互换

评分

参与人数 1黑币 +4 收起 理由
dzbj + 4 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:149144 发表于 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

评分

参与人数 1黑币 +6 收起 理由
dzbj + 6 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:421562 发表于 2018-11-6 10:38 | 显示全部楼层
你是用C语言吗,还是用位操作吧,写一个函数。
回复

使用道具 举报

ID:89515 发表于 2018-11-6 10:47 | 显示全部楼层
N|=(X&0x01<<i)<<(7-i);。N为目标数,X为原数,i=(0-7).

评分

参与人数 1黑币 +7 收起 理由
dzbj + 7 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:47286 发表于 2018-11-6 11:22 | 显示全部楼层
xuyaqi 发表于 2018-11-6 10:11
给个例程:
#include "reg51.h"

感谢回复

我觉得您的方法消耗的时间会比偏多
回复

使用道具 举报

ID:47286 发表于 2018-11-6 11:24 | 显示全部楼层
cuihaodianzi 发表于 2018-11-6 10:28
简单粗暴
#include
unsigned int temp = 0x61;  //  0110 0001  -> 1000 0110    0x86

谢谢

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

使用道具 举报

ID:47286 发表于 2018-11-6 11:25 | 显示全部楼层

不明觉厉 我好好想想

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

使用道具 举报

ID:149144 发表于 2018-11-6 11:52 | 显示全部楼层

按照这个操作,貌似所有的“位” 都在最高位了,除了 0000 0000,的结果是 0,
其他的结果应该都是 1000 0000 吧 ?
回复

使用道具 举报

ID:149144 发表于 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;
  }  
}

评分

参与人数 1黑币 +4 收起 理由
dzbj + 4 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:266660 发表于 2018-11-6 12:39 | 显示全部楼层
高右低左
回复

使用道具 举报

ID:89515 发表于 2018-11-6 12:56 | 显示全部楼层
dzbj 发表于 2018-11-6 11:25
不明觉厉 我好好想想

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

你要做什么,时间要求很高吗?8位数据的加减移位是很快的了,不然就只有用汇编了
回复

使用道具 举报

ID:89515 发表于 2018-11-6 12:58 | 显示全部楼层
cuihaodianzi 发表于 2018-11-6 11:52
按照这个操作,貌似所有的“位” 都在最高位了,除了 0000 0000,的结果是 0,
其他的结果应该都是 1000 ...

7-i   ???????????????
回复

使用道具 举报

ID:421655 发表于 2018-11-6 13:13 来自手机 | 显示全部楼层
逻辑运算。例如汇编语言。1. 循环左移一次: RL  A; 2. 高低四位交换:SWAP  A; 3. 循环右移四次:RR   A; 4. 要用几条指令才能实现。

评分

参与人数 1黑币 +4 收起 理由
dzbj + 4 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:387733 发表于 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);
}

评分

参与人数 1黑币 +7 收起 理由
dzbj + 7 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:421684 发表于 2018-11-6 14:02 | 显示全部楼层
除以16,用商+16*余数
回复

使用道具 举报

ID:421696 发表于 2018-11-6 14:14 来自手机 | 显示全部楼层
高位右移,低位左移
回复

使用道具 举报

ID:149144 发表于 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位 吗 ?

评分

参与人数 1黑币 +4 收起 理由
dzbj + 4 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:149144 发表于 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
20181106155842.jpg
20181106160020.jpg
20181106160047.jpg

评分

参与人数 1黑币 +7 收起 理由
dzbj + 7 感谢你的认真 赞

查看全部评分

回复

使用道具 举报

ID:89515 发表于 2018-11-6 17:37 | 显示全部楼层

确实,谢谢!!!
N|=(X<<i&0x80)>>(7-i);。N为目标数,X为原数,i=(0-7).
回复

使用道具 举报

ID:89515 发表于 2018-11-6 17:37 | 显示全部楼层

N|=(X<<i&0x80)>>(7-i);。N为目标数,X为原数,i=(0-7).
回复

使用道具 举报

ID:89515 发表于 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);
也可以对调法,不用循环,但是不知道是否节约时间

回复

使用道具 举报

ID:47286 发表于 2018-11-6 20:03 | 显示全部楼层
mengzhixinheng 发表于 2018-11-6 12:56
你要做什么,时间要求很高吗?8位数据的加减移位是很快的了,不然就只有用汇编了

倒不是时间的问题 我也能用移位的方法实现 只是方法比较笨 正常思维 想请教前辈们有什么更好的方法 这么简单的位操作就不应该消耗很多时间 简单的程序当然没问题 复杂程序就不好了
回复

使用道具 举报

ID:47286 发表于 2018-11-6 20:06 | 显示全部楼层
51heidianzixy 发表于 2018-11-6 14:02
除以16,用商+16*余数

感谢你的回复

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

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表