二進位制操作

2021-06-21 11:20:24 字數 4121 閱讀 2377

關於二進位制操作很常見,很多筆試面試題中也有涉及,本篇主要圍繞二進位制翻轉,二進位制最高位判定和給定整數的二進位制輸出來**靈活使用二進位制的&,|,!,》,《操作。

一、給定整數的二進位制翻轉

思路:可以考慮逐次翻轉得到最終的翻轉結果,具體做法,首先將所有二進位制位奇偶位逐個翻轉,然後以兩位為一對(作為整體)奇偶對逐次翻轉,依次。。。,最終完成翻轉。

具體**示例:

//bit_reverse:32位數按位反轉函式

// 作用:把乙個32位整數按位反轉,即第1位轉到第32位,第2位轉到第31位,依次下去。

//演算法實現:第一行**為奇偶位相互交換;第二行為以兩位為一單元,奇偶單元進行交換;第三行為以四位為一單元,奇偶單元進行交換;第四行為以八位為一單元,奇偶單元進行交換;最後一行為以十六位為一單元,奇偶單元進行交換。至此,32位反轉完成,演算法結束。

//注意:對於8位的翻轉,方法是類似的,只是遞增移位到 n >> 4即可。

static unsigned int bit_reverse(unsigned int n)

說明:本**是以n為32位考慮的,根據輸入資料所佔bit位數的不同,可以選擇相應需要移位到的級別。比如,對於char型別資料,只需要移位到 n >> 4 即可。

二、給定整數輸出最高位為1的位置

思路:考慮通過移位來解決,

每次將需要判定的bit位移位到最低位,如果移位後值為!=0,輸出即可。

具體**示例:

//find_most_significant_bit:求出32位數中從高位到低位的第乙個bit=1的bit位

// 實現:按位右移判斷

static int find_most_significant_bit(unsigned int n)

} return 0;

}

說明:

注意首先獲取需要判定值的長度。int length = sizeof(n) * 8...

三、給定整數輸出其二進位制

1)網上覆雜版本

static void printf_binary(unsigned int n)

}}

說明:具體還有待分析,感覺邏輯比較複雜,思路不夠清晰。

2)不斷除2模2求解

思路:首先計算出資料需要幾位(有效位,不含0)來表示,申請對應大小快取陣列,然後通過不斷地除和模運算得到每一位的值,儲存在快取陣列,最後輸出即可。

具體**示例:

//printf_binary_bit_mod:以二進位制形式輸出整數

static void printf_binary_bit_mod(unsigned int n)

int *bit_arr = (int *)malloc(sizeof(int) * bit_length);

memset(bit_arr, 0, bit_length);

//或者如下**進行記憶體初始化

//int *temp = bit_arr;

//for(int i = 0; i < bit_length; i++)

// int i = 0;

while(n)

for(int i = (bit_length - 1); i >= 0; i--) }

}

說明:除2模2常規思路。

3)移位判定求解

思路:基本思路和2)類似,但是這裡主要採用移位運算進行判定,感覺**更清晰。

//printf_binary_bit_mod:以二進位制形式輸出整數

static void printf_binary_bit_shift(unsigned int n)

int *bit_arr = (int *)malloc(sizeof(int) * bit_length);

memset(bit_arr, 0, bit_length);

for (int i = 0; i < bit_length; i ++)

for(int i = 0; i < bit_length; i++)

}

說明:首先通過不斷地移位判定,計算出有效需要bit位長度,然後具體每一位的求解思路是,將這一位移位到最右邊,然後進行模2運算,直接可以得到結果。因為

最右邊bit位的值決定了整個移位後資料模2的結果,所以其結果必定是對應位的bit value。

當然,不通過移位,而是通過math.pow指數函式,求解也是可以的。

while (pow(2.0f, m) <= n) 

a = (int*)malloc(sizeof(int)*(m));

for (int i = 0; i < m; i ++)

綜合:具體的說到這裡,要注意的是,多運用bit運算(移位。。。)

下面附上完整**:

#include #include #include int find_most_significant_bit(unsigned int n);

unsigned int bit_reverse(unsigned int n);

void printf_binary(unsigned int n);

void printf_binary_bit_mod(unsigned int n);

void printf_binary_bit_shift(unsigned int n);

int main()

//bit_reverse:32位數按位反轉函式

// 作用:把乙個32位整數按位反轉,即第1位轉到第32位,第2位轉到第31位,依次下去。

//演算法實現:第一行**為奇偶位相互交換;第二行為以兩位為一單元,奇偶單元進行交換;第三行為以四位為一單元,奇偶單元進行交換;第四行為以八位為一單元,奇偶單元進行交換;最後一行為以十六位為一單元,奇偶單元進行交換。至此,32位反轉完成,演算法結束。

//注意:對於8位的翻轉,方法是類似的,只是遞增移位到 n >> 4即可。

static unsigned int bit_reverse(unsigned int n)

//find_most_significant_bit:求出32位數中從高位到低位的第乙個bit=1的bit位

// 實現:按位右移判斷

static int find_most_significant_bit(unsigned int n)

} return 0;

}//覺得這個寫的比較複雜,邏輯不清晰,需要再進一步研究

//printf_binary:以二進位制形式輸出整數

// 實現:逐位右移判斷

static void printf_binary(unsigned int n) }}

//printf_binary_bit_mod:以二進位制形式輸出整數

static void printf_binary_bit_mod(unsigned int n)

int *bit_arr = (int *)malloc(sizeof(int) * bit_length);

memset(bit_arr, 0, bit_length);

//或者如下**進行記憶體初始化

//int *temp = bit_arr;

//for(int i = 0; i < bit_length; i++)

// int i = 0;

while(n)

for(int i = (bit_length - 1); i >= 0; i--) }

}//printf_binary_bit_mod:以二進位制形式輸出整數

static void printf_binary_bit_shift(unsigned int n)

int *bit_arr = (int *)malloc(sizeof(int) * bit_length);

memset(bit_arr, 0, bit_length);

for (int i = 0; i < bit_length; i ++)

for(int i = 0; i < bit_length; i++)

}

二進位制 二進位制起源

現代通訊技術的基礎是二進位制編碼。早在1865年麥克斯韋總結出麥克斯韋方程組之前,美國人摩斯 morse 於1837年發明了摩斯電碼和有線電報。有線電報的出現,具有劃時代的意義 它讓人類獲得了一種全新的資訊傳遞方式,這種方式 看不見 摸不著 聽不到 完全不同於以往的信件 旗語 號角 烽火,這也是二進...

二進位制檔案操作

無關資料區 jpg資料區 無關資料區 jpg資料區 無關資料區 jpg資料區 現想把這些jpg資料從該檔案中讀出來,生成乙個個單獨的檔案,該如何做呢?幫你寫了個程式,測試了只含有乙個資訊的檔案 呼叫 void test fp.close 思路是,先得到ff的值,然後再判斷下一位是否是0xd8,但這裡...

二進位制檔案操作

無關資料區 jpg資料區 無關資料區 jpg資料區 無關資料區 jpg資料區 現想把這些jpg資料從該檔案中讀出來,生成乙個個單獨的檔案,該如何做呢?幫你寫了個程式,測試了只含有乙個資訊的檔案 呼叫 void test fp.close 思 路是,先得到ff的值,然後再判斷下一位是否是0xd8,但這...