逆序輸入數的二進位制序列輸出

2021-08-13 08:54:25 字數 1736 閱讀 5535

編寫函式:

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...