找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 8445|回复: 29
打印 上一主题 下一主题
收起左侧

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

  [复制链接]
跳转到指定楼层
楼主
一个二进制数 用什么运算能让高位和低位反过来

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

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

不是移位 是让原来的最低位成最高位
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
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 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

5#
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 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

6#
ID:47286 发表于 2018-11-6 10:14 | 只看该作者
在此一并感谢沙发 板凳 地板的回复

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

使用道具 举报

7#
ID:421547 发表于 2018-11-6 10:20 | 只看该作者
目标是1000 0000
回复

使用道具 举报

8#
ID:300089 发表于 2018-11-6 10:25 | 只看该作者
直接与运算,与完保存高位数据和地位数据~再互换

评分

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

查看全部评分

回复

使用道具 举报

9#
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 (72.86 KB, 下载次数: 67)

20181106102702.jpg

评分

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

查看全部评分

回复

使用道具 举报

10#
ID:421562 发表于 2018-11-6 10:38 | 只看该作者
你是用C语言吗,还是用位操作吧,写一个函数。
回复

使用道具 举报

11#
ID:89515 发表于 2018-11-6 10:47 | 只看该作者
N|=(X&0x01<<i)<<(7-i);。N为目标数,X为原数,i=(0-7).

评分

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

查看全部评分

回复

使用道具 举报

12#
ID:47286 发表于 2018-11-6 11:22 | 只看该作者
xuyaqi 发表于 2018-11-6 10:11
给个例程:
#include "reg51.h"

感谢回复

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

使用道具 举报

13#
ID:47286 发表于 2018-11-6 11:24 | 只看该作者
cuihaodianzi 发表于 2018-11-6 10:28
简单粗暴
#include
unsigned int temp = 0x61;  //  0110 0001  -> 1000 0110    0x86

谢谢

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

使用道具 举报

14#
ID:47286 发表于 2018-11-6 11:25 | 只看该作者

不明觉厉 我好好想想

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

使用道具 举报

15#
ID:149144 发表于 2018-11-6 11:52 | 只看该作者

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

使用道具 举报

16#
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 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

17#
ID:266660 发表于 2018-11-6 12:39 | 只看该作者
高右低左
回复

使用道具 举报

18#
ID:89515 发表于 2018-11-6 12:56 | 只看该作者
dzbj 发表于 2018-11-6 11:25
不明觉厉 我好好想想

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

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

使用道具 举报

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

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

使用道具 举报

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

评分

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

查看全部评分

回复

使用道具 举报

21#
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 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

22#
ID:421684 发表于 2018-11-6 14:02 | 只看该作者
除以16,用商+16*余数
回复

使用道具 举报

23#
ID:421696 发表于 2018-11-6 14:14 来自手机 | 只看该作者
高位右移,低位左移
回复

使用道具 举报

24#
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 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

25#
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 (108.54 KB, 下载次数: 58)

20181106155802.jpg

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

20181106155842.jpg

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

20181106160020.jpg

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

20181106160047.jpg

评分

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

查看全部评分

回复

使用道具 举报

26#
ID:89515 发表于 2018-11-6 17:37 | 只看该作者

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

使用道具 举报

27#
ID:89515 发表于 2018-11-6 17:37 | 只看该作者

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

使用道具 举报

28#
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);
也可以对调法,不用循环,但是不知道是否节约时间

回复

使用道具 举报

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

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

使用道具 举报

30#
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 单片机教程网

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