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

標題: 1個字節數據 怎么把高八位和低八位對稱換位? [打印本頁]

作者: 231244234    時間: 2023-4-29 19:14
標題: 1個字節數據 怎么把高八位和低八位對稱換位?
比如1000 0000變成0000 0001
1100 0101變成1010 0011
這樣對稱換位,大佬們

作者: csmyldl    時間: 2023-4-30 00:31
數據存dat1,換位結果存dat2
for (i=0;i<8;i++)
{
   j=(bit)(dat1&0x80);
    if (j)
       dat2=dat2+0x80;
    dat1=dat1<<1;
    dat2=dat>>1;
}

作者: 召喚獸    時間: 2023-4-30 09:10
在C語言中,可以使用位運算符對二進制數進行位反轉操作。  對于將二進制數1100 0101變成1010 0011,可以這么實現:  c unsigned char x = 0xC5; // 將16進制數0xC5賦值給無符號字符變量x x = ((x & 0x55) << 1) | ((x & 0xAA) >> 1); // 與0x55做與操作得到奇數位,與0xAA做與操作得到偶數位,然后將奇偶位的結果進行交換 x = ((x & 0x33) << 2) | ((x & 0xCC) >> 2); // 與0x33做與操作得到8位中的4位一組的左側4位,與0xCC做與操作得到右側4位,然后將每組4位的位置互換 x = ((x & 0x0F) << 4) | ((x & 0xF0) >> 4); // 與0x0F做與操作得到低4位,與0xF0做與操作得到高4位,然后將低高位的結果進行交換 最終得到的x的值為十六進制數0xA3,即二進制數1010 0011
作者: 231244234    時間: 2023-4-30 09:26
csmyldl 發表于 2023-4-30 00:31
數據存dat1,換位結果存dat2
for (i=0;i

大佬我能說沒看懂嗎
作者: Hephaestus    時間: 2023-4-30 09:47
召喚獸 發表于 2023-4-30 09:10
在C語言中,可以使用位運算符對二進制數進行位反轉操作。  對于將二進制數1100 0101變成1010 0011,可以這 ...

是的,hacker's delight這本書第7章說的就是這種蝶形算法。
作者: TTQ001    時間: 2023-4-30 09:49
要將高位位置與低位位置交換,您可以使用以下代碼并獲得二進制格式。
char new_byte;
bool new_bit[8];
char byte1;
bool bit[8];
for(int i= 0; i<8; i++)
{
        bit[i] = ((byte1>>i) & 0x01);
        new_bit[7-i] = bit[i];
}
如果要獲取新字節,請使用以下代碼:
unsigned int bitsToBytes(unsigned char *bits)
{
  unsigned int sum = 0;
  for (int i = 0; i < 8; i++)
  {
    sum += bits[i] - '0';
    sum<<=1;
  }
  return sum;

}

new_byte = bitToByte(*new_bit);
作者: devcang    時間: 2023-4-30 10:37
這樣


#include<stdio.h>

int main(int argc, char*argv[]){
        unsigned char a=0xab, b;
       
        printf("%02x\r\n", a);

        b = (a>>4)&0xf;
        a = (a<<4) | b;         //這2行

        printf("%02x\r\n", a);

        return 0;
}

作者: devcang    時間: 2023-4-30 10:58
上一帖確實看錯,不管管理員確認了,直接補一樓


#include<stdio.h>

void printBin(unsigned char a){
        int i;
        for(i=0; i<8; i++){
                printf("%d", a&0x80?1:0);
                a=a<<1;
        }
}

int main(int argc, char*argv[]){
        unsigned char a=0xab, b, i, j;
        for(i=0x79; i<0x8f; i++){//測試幾個數,看結果是否對
                a=i;
                printBin(a);
                printf(" ");
        }
        printf("\r\n");
       
        for(i=0x79; i<0x8f; i++){
                a=i;
               
                //對稱調換---begin
                b=0;
                for(j=0; j<8; j++){
                        b=b | ((a&1)<<(7-j)) ;
                        a=a>>1;
                }                                       
                //對稱調換---end
                printBin(b);
                printf(" ");
        }
        printf("\r\n\r\n");
       
       
        //=================================
        a=0xab;
        printf("%02x\r\n", a);
        b=(a>>4) | (a<<4);  //高低對調
        printf("%02x\r\n", b);
       
        return 0;
}


// http://www.zg4o1577.cn/bbs/dpj-228623-1.html
//VC2008測試過。
作者: li64331218    時間: 2023-4-30 11:02
先做高低字節交換,再按位取反。
作者: coody_sz    時間: 2023-4-30 11:45
查表最快
作者: hhh402    時間: 2023-4-30 13:19
用二樓的程序簡化一下:
數據存dat1,換位結果存dat2
dat2=0; //開始要先清零
for (i=0;i<8;i++)
{
    if (dat1&0x80)  //判斷dat1最高位是否=1
    dat2=dat2+1;  //如果dat1最高位=1,將dat2最低位+1,相當于將dat1高位移到dat2低位。
    dat1=dat1<<1;
    dat2=dat2<<1;
}
作者: 光說不練    時間: 2023-4-30 15:25
分別提取各位,然后用堆棧。
作者: npn    時間: 2023-4-30 16:41
查表浪費內存空間,循環語句浪費時間,還是Verilog劃算:
  1. module main(                                //對稱換位模塊
  2.         input [7:0] in,                //[8位寬]輸入
  3.         output [7:0] out                //[8位寬]輸出

  4. );
  5. genvar i;
  6. generate
  7. for(i=0;i<8;i=i+1) begin:gen
  8.         assign out[i] = in[7-i];
  9. end
  10. endgenerate
  11. endmodule
復制代碼

作者: wulin    時間: 2023-4-30 16:48
寫一個簡單函數,容易理解些。
unsigned char Conversion(unsigned char dat)
{
        unsigned char i,temp;
        for(i=0;i<8;i++)
        {
                temp|=((dat&0x01)<<(7-i));
                dat>>=1;
        }
        return temp;
}
作者: cnos    時間: 2023-4-30 22:23
老問題了,論壇有討論過這個,8位查表速度最快,移位蝶形也不見得省程序空間(可以自己對比一下編譯出來的code空間和跑完函數花的機器周期state),4位查表綜合代碼長度和執行速度折中最好。
作者: lyonkon    時間: 2023-4-30 23:39
將值存入位尋址區,然后cy取位。acc移位。以 51為例
mov 20h,#00110110b  //假設值為00110110b
mov cy,07h   //20h最高位
RR a        //ACC右移
mov cy,06h   //20h次高位
RR a        //ACC右移
.......      ..........
八次過后,結果存在acc中。 嵌入到C語言中

作者: hhh402    時間: 2023-5-1 01:14
npn 發表于 2023-4-30 16:41
查表浪費內存空間,循環語句浪費時間,還是Verilog劃算:

Verilog還沒有了解過,要認真學習一下。不過下面的語句好像也是循環:
for(i=0;i<8;i=i+1) begin:gen
        assign out = in[7-i];
作者: npn    時間: 2023-5-1 08:15
hhh402 發表于 2023-5-1 01:14
Verilog還沒有了解過,要認真學習一下。不過下面的語句好像也是循環:
for(i=0;i

Verilog是一種并行語言,與串行語言不同,這里的循環是將8根導線接上。
作者: dese    時間: 2023-5-1 08:31
   int dat1 = 0xc5;
   int dat2 = 0;
   for(int l=0, d4 =128; l<8; l++ )
   {   
           dat2 += dat1%2*d4;
           dat1/=2;
           d4/=2;          
   }
作者: 231244234    時間: 2023-5-2 13:46
wulin 發表于 2023-4-30 16:48
寫一個簡單函數,容易理解些。
unsigned char Conversion(unsigned char dat)
{

如果是0xAA他就不行呀
作者: Hephaestus    時間: 2023-5-2 15:02
cnos 發表于 2023-4-30 22:23
老問題了,論壇有討論過這個,8位查表速度最快,移位蝶形也不見得省程序空間(可以自己對比一下編譯出來的c ...

蝶形算法在32位機對換32位數據的高低位還是很有性價比的,樓主連自己的單片機型號什么的都不說,誰也沒法猜出最佳方案,大家散了吧。
作者: wulin    時間: 2023-5-2 15:14
231244234 發表于 2023-5-2 13:46
如果是0xAA他就不行呀

0xAA轉換后0x55,你沒有驗證怎么說不行?
作者: 多木    時間: 2023-5-2 23:02
  1. unsigned char swapBits(unsigned char data)
  2. {
  3.   return ((data >> 4) & 0x0F) | ((data << 4) & 0xF0);
  4. }
復制代碼
這里使用了右移和左移操作來將高八位和低八互換位置。首先將數據向高四清,只低四位的數據。然后再將數據向左移動4位(低四位移到高四位),與0xF0進行按位與運算,將低四位清零,只留下高四位的數據。最后將這兩位或運算合并起來,就完成了高八位和對稱互換位置的操作。

作者: hhh402    時間: 2023-5-2 23:41
23樓的轉換錯了吧,樓主意思是ABCDEFG變成GFEDCBA。不是高四位與低四位互換。
作者: Y_G_G    時間: 2023-5-3 19:59
什么代碼簡單,容易理解,就用這個代碼,什么占內存,速度快的.壓根就不需要考慮
我公司之前用的是512B內存的單片機,隨便寫點代碼就用完了
我也曾經想過所謂的"優化代碼"
折騰了好久,才發現,1K內存單片機的價格僅僅高了一分錢而已
得多少量才把這1分錢省回來呀,干脆就不折騰了,直接換1K的
作者: Longan.Wang    時間: 2023-5-4 11:57
Y_G_G 發表于 2023-5-3 19:59
什么代碼簡單,容易理解,就用這個代碼,什么占內存,速度快的.壓根就不需要考慮
我公司之前用的是512B內存的 ...

有道理。。。。。。。。
作者: ydatou    時間: 2023-5-4 15:30
wulin 發表于 2023-4-30 16:48
寫一個簡單函數,容易理解些。
unsigned char Conversion(unsigned char dat)
{

你的代碼改成這樣,效率更高。
  1. unsigned char Conversion(unsigned char dat)
  2. {
  3.     unsigned char i, r = 0;
  4.     for (i = 0; i < 8; i++)
  5.     {
  6.         r <<= 1;
  7.         r += dat & 0x01;
  8.         dat >>= 1;
  9.     }
  10.     return r;
  11. }
復制代碼

作者: 滑動的憨憨    時間: 2023-5-4 15:48
用匯編的話,直接選擇帶進位的左右循環,CY標志位做中轉站就可以

      
作者: 名字不是重點    時間: 2023-5-5 11:36
召喚獸 發表于 2023-4-30 09:10
在C語言中,可以使用位運算符對二進制數進行位反轉操作。  對于將二進制數1100 0101變成1010 0011,可以這 ...

好一只漂亮、輕靈的蝴蝶!!
學習了~~




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产自产c区 | 久久精品亚洲国产奇米99 | 亚洲视频免费播放 | 国产视频91在线 | 欧美一级在线 | 国产一区二区三区久久久久久久久 | 欧美精品一区二区三区一线天视频 | 一级大黄色片 | 色播视频在线观看 | 韩日在线观看视频 | 色精品视频 | 欧美二区三区 | 97视频成人 | 华丽的挑战在线观看 | 国产农村一级片 | 亚洲精品久久久久久一区二区 | 九九精品在线 | 亚洲巨乳自拍在线视频 | 久久99精品久久久久久国产越南 | 国产精品 亚洲一区 | 在线免费观看a级片 | 精品av天堂毛片久久久借种 | 国产精品一区一区 | 黄网免费看 | 国产伦精品一区二区三区视频金莲 | 欧美一级毛片免费观看 | 97国产精品视频人人做人人爱 | 久久人人国产 | 欧美一二区 | 日韩一区二区三区av | 国产精品久久久久久久久久尿 | 欧美国产精品一区二区三区 | 亚洲精品大全 | 亚洲精品白浆高清久久久久久 | 久久久久一区二区三区四区 | 久久精品色欧美aⅴ一区二区 | 天天看天天摸天天操 | 九九精品在线 | 激情五月综合网 | 精品国产一级 | 伊人久操 |