題目要求如下:
分析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,用此數與...