C 用位運算輸出變數的二進位制序列

2021-08-18 06:35:04 字數 2727 閱讀 4346

題目要求如下:

分析binaryout這個函式:

unsigned char tmp = 0x80,轉換為二進位制就是1000,0000。而字元c在記憶體中所佔大小為一位元組,與1000,0000做按位與運算其實就取決於字元c的ascii碼轉換為二進位制的首位是1還是0。

如'a',其ascii碼為97,轉換為二進位制就是0110,0001,與1000,0000按位與就得到0。而0作為判斷條件即為假,輸出了0;接著tmp>>=1,即tmp右移一位,得到0100,0000,與a(0110,0001)按位與得到1,為真,輸出1…… 以此類推,即輸出了'a'的二進位制序列。

注:這裡如果用tmp的型別能不能是char而不是unsigned char?

需要注意char是帶符號的,因此其範圍是-128~127,若賦值1000,0000(128)則會溢位,且會變為-128(1000,0000的第一位是1,代表了是負數)。

分析displayinbinary這個函式:

這裡面有兩個引數,其中void *data是無型別指標,它指向的資料型別暫時不確定;後期使用時一般要通過強制型別轉換(再轉換成具體型別前不能通過*解引用,因為void指標只知道指向變數的首位址,而不知道指向變數所佔的位元組大小)。而int  len引數就是變數所佔位元組的大小。

#include using namespace std;

void displayinbinary(void *data , int len);

void binaryout(char c);

int main()

void displayinbinary(void *data , int len)

cout <

}

這裡我的想法是根據變數所佔的位元組數,來取得不同的tmp與其做位運算。比如short是2位,我就用1000,0000,0000,0000和它做按位與運算。

輸出結果如下:  

01100001

0000000100000001

00111111100000000000000000000000

關於列印浮點數的疑惑:為什麼這裡可以用int型指標指向存放float型的位址?是否會發生型別轉換呢?

//float f = 1.0f;

cout << data << endl;

cout << (int *)data << endl;

cout << *(int *)data << endl;

輸出結果如下:

0x71ff2c

0x71ff2c

1065353216

其中1065353216轉換為二進位制就是00111111,10000000,00000000,00000000。

為什麼是這樣的呢?

這裡就要說說浮點數的儲存方式了:

根據國際標準ieee規定,任何乙個浮點數num的二進位制數可以寫為: 

num = (-1)^s*m*2^e;

①當s(sign)為0時,表示乙個正數;當s為1時,表示乙個負數 。

②e(exponent)表示指數:即科學計數法中的指數,2的多少次方。

③m(mantissa)表示尾數部分。

因此00111111,10000000,00000000,00000000可以解讀為0,01111111,00000000000000000000000。

其中m(尾數)部分看上去只有23位的精度,事實上是有24位:因為科學計數法中,如1.01001*2^5,事實上小數點前的1是可以省略的。

然而e(指數)部分看上去有8位,實際上只有7位的精度,因為指數是有正負的。因此指數其實是從00000000(-127)開始到11111111(+128)結束的。故這裡的01111111應該解讀為指數為0。從而浮點數f的值就是1.0了。

(是老師給出的思路)

#include using namespace std;

void binaryout(char);

void displayinbinary(void *, int);

int main()

void binaryout(char c)

}void displayinbinary(void * data, int len){

char *ptr = (char *)data;

ptr += (len-1);

//棧中高位址往低處增長,先讓指標指向高位址

//才能按順序列印出來

for(int i =0; i其中對於 ptr += (len-1); 我們需要分析一下棧中的儲存情況:

(以short n=100為例)

因此在for迴圈中ptr--就是將指標向低位址方向移動;從而借助binarout函式將其二進位制序列列印出來。

二進位制位運算

與運算,6 3 2 或運算 6 3 7 異或運算 6 3 5 反碼 6 7 左移 3 2 12 3 2 2 12 右移 3 1 1 3 2 1 無符號右移 3 1 1 3 2 1 按位與,當兩位同時為1時才為1如 1 1 1 1 0 0 0 1 0 6 3相當於 0110 0011 0010 2 按...

二進位制位運算

一 按位與 位全為1,結果才為1 0 0 0 0 1 0 1 0 0 1 1 1 特殊用法 清零。如果想將乙個單元清零,就是使其全部二進位制位為0,只要與乙個各位都為零的數值相與,結果為零 取乙個數中的指定位。如x 10101110要取x的低4位,用x 00001111 00001110即可 二 按...

二進位制的位運算

按位與 兩位全為1,結果為1 特殊用途 1 清零,想要將乙個單位清零,只要與乙個各位都為零的數值相與,結果為零 2 去乙個數中的指定位 如 x 10101110,取x的低四位用x 0000 1111 0000 1110即可得到 方法 找到乙個數,對應x要取的位,該數的對應位為1,其餘位為0,用此數與...