C/C++取數據中高8位,低8位,合成新數據


有時,需將某一串數字中感興趣的某些位的數據進行提取,並將提取的數據合並成新數據,可用位運算來實現。

1.取低幾位的數:可用&運算符,通過取低幾位的二進制置為1來實現。(低8位:0xff)

2.取高幾位的數:先通過右移將高幾位數據移到低位,再通過&運算來實現。

3.將取得的位數進行合並:先通過左移恢復取得的高幾位數據的權值,再和取得低幾位數據進行|運算來合成新數據。

注:左移和右移是針對補碼來說。

#include <stdio.h>
#include <stdlib.h>
unsigned char n_right,n_left,temp; //right表示低8位,left表示高8位
int size_right,size_left,size_temp;
short int num,size_num;
short int num_two,num_three; //int 4字節,short int 2字節
 int main()
 {  
    /*  本文 2 字節 
    *   存放取值的數必須是無符號數類型,否則,取得16為的低8位:1111 1111,
    *   會把取得的8位中的高位1作為符號為1(負數),取真值的會按
    *   為取反,加1,為-1;
    */
    num = 32767;  //16進制 0111 1111 1111 1111
    size_num = sizeof(num);
    size_right = sizeof(n_right);
    size_left = sizeof(n_left);
    size_temp = sizeof(temp);
//    printf("size_num = %d 個字節\n",size_num);
//  printf("size_right = %d 個字節\n",size_right);
    printf("原數num= %d\n",num);
    n_right = num &0xFF; //取低8位 n_right =  2 ^8 -1 = 255  
    printf("n_right = %d \n",n_right);
    n_left = (num  >> 8) & 0xff; //取高8位 n_right =  2 ^7 -1 = 127  
    printf("n_left = %d \n",n_left);

    unsigned char n_r4;
    n_r4 = num & 0x0f; // 0111 1111 1111 1111  取低4位 n_r4  1111 = 2^4 -1 = 15          
    printf("n_r4 = %d \n",n_r4);

    unsigned char n_l4; //取高4位
    n_l4 =   (( num >>= 8) >> 4 ) & 0x0F; //0111 1111 1111 1111 取高4位 n_l4  0111 = 2 ^3 -1 = 7           
    printf("n_l4 = %d \n",n_l4); 
    


    //把高8位與低8位結合
    num_three = n_left;
    num_three <<= 8; //恢復高位
    num_three |= n_right; //或上低位
    printf("num_three = %d ",num_three);  //結果32767
    return 0;
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM