關於二進位制操作很常見,很多筆試面試題中也有涉及,本篇主要圍繞二進位制翻轉,二進位制最高位判定和給定整數的二進位制輸出來**靈活使用二進位制的&,|,!,》,《操作。
一、給定整數的二進位制翻轉
思路:可以考慮逐次翻轉得到最終的翻轉結果,具體做法,首先將所有二進位制位奇偶位逐個翻轉,然後以兩位為一對(作為整體)奇偶對逐次翻轉,依次。。。,最終完成翻轉。
具體**示例:
//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,但這...