原代碼 :
轉化原理:
由於c++內是無法直接輸出數的二進制的,所以得我們自己來操作。
思路是將目標數移位與1進行&操作,來獲取各個位的0,1的值然後一一輸出。
比如:
bin(8)= 0000 1000 //8的二進制 bin(1)= 0000 0001
8 >> 7 = 0000 0000 &0000 0001 = 0 //將8的二進制右移7位
8 >> 6 = 0000 0000 0
8 >> 5 = 0000 0000 0
8 >> 4 = 0000 0000 0
8 >> 3 = 0000 0001 &0000 0001 = 1
8 >> 2 = 0000 0000 0
8 >> 1 = 0000 0000 0
8 >> 0 = 0000 0000 0
將他們的值一一與1(0000 0001)進行&操作 一一輸出可以得出8的二進制0000 1000
輸出:(ps:可以把BIT改值來支持更高位)
如同此圖
調試:(輸入爲8)
可以發現bin裏面存儲的都是'\0'與'\x1'!
如果我們不強制轉換(int)bin[]的話會造成同下面一樣結果。
輸出了右邊的符號
所以我們將其強制轉換爲int後輸出纔得到我們想要答案。
爲什麼不轉換會是這個結果?
大家有注意到這個語句嗎?
j = (i >> x) & 1;
我們可以看到前面的定義j是char型 而i是int型的。我們這樣其實就是在強制轉換了。
什麼是強制轉化?
衆所周知int型在內存中佔4個字節,而char型爲1個字節。那麼我們強制轉換系統要去掉高位的3個字節。
比如進行下列操作
int x=255;
char y=(char)x;
cout << int(y) ;
輸出爲-1 (255-256)
char型數據的範圍是-128~127(256),你可以把他想象成一個圓盤,最上面是0,向右+1,向左-1,最下面是127和-128相鄰。當你將一個大於127的正數轉換時,可以理解成從零出發繞圈,最終結果就是停留的格子。
同樣的如果x爲512的話那麼會被轉化爲0。
但在這裏我們發現我還是使用了cout << int(y) 才能輸出。
我想知道的是爲什麼一定得 (int)y 才能輸出呢?
我發現0與1被轉化爲了'\0'與'\x1'。
而‘/0’是字符常量,0是整型常量。其中字符常量也可以用轉義序列來表示。
什麼是轉義序列?
在C++裏面有兩類字符不能直接使用,轉義序列和泛化轉義序列。
轉義序列爲\r \n \t \b等之類的(大家可以自己查查)而我們的問題出現在這其中的泛化的轉義序列。
泛化的轉義序列的形式有兩種:
1.\後緊跟3個八進制數(最多隻能3個,超過的算其他字符):
如\12表示換行符,\40表示空格,\124表示大T,\1243則表示T3。
2.\x後面緊跟着1個或多個十六進制數:
如\xa表示換行符,\x20表示空格,\x54表示大T,由於字符只佔8位,所以最多隻能有兩個16進制位,多了會報錯。
結論
原來在j = (i >> x) & 1;這個語句中,我們的結果被轉化爲了'\0' '\x1'這樣轉義序列,使得我們的輸出出現了問題,所以我們需要再次強制轉化爲int型才能輸出我們想要的答案!
如有錯誤歡迎大家指出,互相學習讓我們一起成長!
最後附上ASCII碼錶方便大家使用(網上找的)
部分資料參考來自
https://blog.csdn.net/qq_50351157/article/details/110499630
(C語言:int型數據向char型數據的強制類型轉換原理)
https://blog.csdn.net/weixin_43744293/article/details/116520817
(C++中的轉義序列(\r \n \t \b)和泛化轉義序列)
更多遊戲資訊請關註:電玩幫遊戲資訊專區
電玩幫圖文攻略 www.vgover.com