編寫函式: unsigned int reverse_bit(unsigned int value); 這個函式的返回值value的二進位制位模式從左到右翻轉後的值。
阿新 • • 發佈:2018-11-28
如:
在32位機器上25這個值包含下列各位:
00000000000000000000000000011001
翻轉後:(2550136832)
10011000000000000000000000000000
程式結果返回:
2550136832
正解 :
/*編寫函式 unsigned int reverse_bit(unsigned int value); 這個函式的返回值吧value的二進位制位模式從左到右翻轉後的值。 如在32位機器上25這個值包含下列各位: 00000000000000000000000000011001 翻轉後:(2550136832) 10011000000000000000000000000000 */ #include <stdio.h> #include <math.h> int reverse_bit(unsigned int value) { int ret = 0; int bit = 0; int i; for( i=0; i < 32; i++) { ret = ret << 1; //左移一位,儲存前一位 bit = value & 1; //取出最後一位 value = value >> 1;//值右移,取下一位 ret = bit | ret; //最後一位賦給ret } return ret; } int main() { printf("%u\n",reverse_bit(25)); return 0; }
稍微複雜的解法(原創):
#include <stdio.h> #include <windows.h> #include <math.h> /* unsigned int reverse_bit(unsigned int value); 這個函式的返回值value的二進位制位模式從左到右翻轉後的值。 如: 在32位機器上25這個值包含下列各位: 00000000000000000000000000011001 翻轉後:(2550136832) 10011000000000000000000000000000 程式結果返回: 2550136832 */ int bit[32]; //寫一個將翻轉後的二進位制數存放到陣列中 void Reverse_Binary(int value) { int tmp = value; int i = 0; while (tmp != 0) { bit[i++] = tmp % 2; tmp /= 2; } } //寫一個計算反轉後二進位制轉化為十進位制整數的函式 unsigned int To_Decimal(int* b, int value) { Reverse_Binary(value); unsigned int re_value = 0; for (int i = 0; i < 32; ++i) { if (bit[i] != 0) { re_value += pow(2, 31 - i); //倒著加 } } return re_value; } //寫一個翻轉二進位制數且返回翻轉後整數的函式 unsigned int Reverse_Bit(int value) { Reverse_Binary(value); return To_Decimal(bit, value); } int main() { unsigned int re_num = Reverse_Bit(25); printf("%u\n", re_num); system("pause"); return 0; }