欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 請教個低級問題(一個二進制數用什么運算能讓高位和低位反過來) [打印本頁]

作者: 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://m.raoushi.com/bbs/) Powered by Discuz! X3.1