編寫函式:unsigned int reverse_bit(unsigned int value);
這個函式的返回值value的二進位制位模式從左到右翻轉後的值。
如: 在32位機器上25這個值包含下列各位:
00000000000000000000000000011001
翻轉後:(2550136832)
10011000000000000000000000000000
程式結果返回:
2550136832
二進位制序列取出,按位與(&)1能夠取出每一位二進位制序列比如20的二進位制序列為00010100(32位我們這裡只寫出後八位)
與1與,取出0,將20的二進位制序列右移一位(>>1)
重複上述過程,將取出來的每一位放入乙個32個數字的陣列,即為二進位制序列
但是這種寫法需要32次迴圈才能取出所有二進位制序列,無論前面32位有多少個0
例如,如果乙個二進位制序列為:
10000000 00000000 00000000 00000000
此時這個二進位制序列需要32次迴圈才能取出
char為乙個位元組,可以將int的四個位元組分別取出放入char當char此位元組為0,直接陣列內對應二進位制序列存為0,跳過挨個取位的過程
這裡涉及到大端儲存和小端儲存的問題
小端儲存即int的低位元組部分存在記憶體位址的小位址部分
我們可以強轉將數字的位址轉為char *賦給乙個char 的指標變數
舉個例子:
int value = 25;
char * p = &(char *)value;
當這麼取時,接下來p++就可以獲取四個位元組中的第二個位元組,依次獲取,一次取8位,如果8位表示0,跳過取每一位將序列存入陣列過程
我給出的演算法建立在小端儲存的基礎上,執行環境為windows下的vs
#define _crt_secure_no_warnings 1
#include
#include
unsigned
int reverse_bit(unsigned
int value);
int main()
unsigned
int reverse_bit(unsigned
int value)
; int i = 0, j = 31;
unsigned
int ret = 0;
a = &(unsigned
char *)value;//取出要倒序的數的位址,為了優化速度,這裡使用char,一次處理8個位元位
for (i = 0; i < 4; i++)
for (j = 8 * i; j < 8 * (i + 1); j++)//非0,與1來&按位取出二進位制串
*a = *a >> 1;
}a++;
}printf("倒轉的二進位制序列:\n");
for (i = 0; i < 32; i++)
for (i = 0; i < 31; i++)//將陣列裡存的二進位制序列轉成無符號數
ret = ret + arr[i];//加上最後一位二進位制序列
return ret;
}
輸入十進位制數,輸出其二進位制
include using namespace std intmain for i i 0 i return0 輸入乙個正整數,判斷其位數 intdig int num return counter include using namespace std intmain for i i 0 i re...
二進位制輸出
將1 byte 數,以二進位制輸出.注意是1byte數,如果是int之類的,應注意大小端問題.include define bytetobinarypattern d d d d d d d d define bytetobinary byte byte 0x80 1 0 byte 0x40 1 0...
二進位制逆序數
對於乙個十進位制數a,將a轉換為二進位制數,然後按位逆序排列,再轉換為十進位制數b,我們稱b為a的二進位制逆序數。例如對於十進位制數173,它的二進位制形式為10101101,逆序排列得到10110101,其十進位制數為181,181即為173的二進位制逆序數。解法一 非移位運算 intmain w...