久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 9154|回復: 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 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲福利网 | 日韩一区二区三区在线视频 | 欧美色图综合网 | www.黄网| 亚洲国产精品一区二区三区 | 国产成人影院 | 免费激情网站 | 国产精品亚洲第一区在线暖暖韩国 | av高清毛片 | 日本不卡在线视频 | 国产精品一区久久久 | 亚洲 欧美 日韩 在线 | 天天干天天操 | av免费入口| 在线观看免费国产 | 国产日韩欧美激情 | 天天爽夜夜骑 | 国产成人精品久久二区二区91 | 九九久久国产 | 成人精品一区 | 91精品久久久久久久久中文字幕 | 91视频三区 | 2018国产大陆天天弄 | 日韩国产精品一区二区三区 | 欧美 视频 | 另类亚洲视频 | 国产亚洲精品久久19p | 成人黄色在线 | 日韩精品 | 精品一区二区三区在线观看 | 国产精品视频在线播放 | 水蜜桃久久夜色精品一区 | 成人午夜精品 | 日韩欧美三区 | 国产免费拔擦拔擦8x高清 | 久久久久国产一区二区三区四区 | 欧美精品一区二区在线观看 | 精品国产18久久久久久二百 | 夏同学福利网 | 亚洲综合区 | 欧美日韩在线播放 |