左移右移操作_進制轉換與區分


main(  ){
   char  c= 040 ;
   printf(“%o \n",c<< 1 );
}
左移一位等於乘以2 得到080 因為是八進制,所以進一 0100 輸出按照8進制輸出,所以輸出100;
計算機區分:普通數,十進制,前面加0X的是十六進制,前面加0的,是八進制。
八進制由數字0-7組成表達方式由數字0開頭
 
位運算操作符:
1、&:位邏輯與
2、 |:位邏輯或
3、^:位邏輯異或
4、~:位邏輯反
5、>>:右移
6、<<:左移
 
位運算是對字節或字中的實際位進行檢測、設置或者移位,它只適用於字符型和整數型變量以及它們的變體,對其他數據類型不適用。
(1)&  邏輯與的運算規則:當進行兩個數的邏輯與運算時,先將該兩個數化為二進制,然后進行邏輯與運算,當相同位的數只有當雙方都為1時,結果才為1,否則為0。
a=5;
b=4;
c=a%b;
c=4;--------------  a=5=0101  b=4=0100  a&b=0100=4
(2) | 邏輯或的運算規則:當進行兩個數的邏輯或運算時,先將該兩個數化為二進制,然后進行邏輯或運算,當相同位的數只要有一方為1,結果就為1,否則為0。
a=2;b=9;
c=a|b;  a=2=0010; b=9=1001  c=1011=11
(3)邏輯異或的運算規則:當進行兩個數的邏輯異或運算時,先將該兩個數化為二進制,然后進行邏輯異或運算,當相同位的數只有當雙方都為不同數字時,結果才為1,否則為0。
a=6;b=8; c=a^b  ;  a=0110  b=1000; 0110^1000=1110=14;
(4)邏輯反的運算規則: 當進行一個數的邏輯反運算時,先將這個數化為二進制,然后進行邏輯反運算,當數為1時,結果為0,當數為0時結果為1。
a=12;b=~a:  12=1100;~1100=0011=3

按照上面的運算規則,我們先將12轉換為二進制,為1100,進行位邏輯反運算,則為0011,化為十進制數結果應為3才對啊,那為什么測試的結果是-13呢?
原來啊,在計算機中,二進制的存儲方式是以補碼的形式存儲的。
所以,12在計算機內存儲的是01100(第一個0位符號位,代表這個數是正數),對其進行邏輯反運算則為10011,但這個二進制只是b這個變量在計算機內的存儲形式(即b的補碼形式),所以我們需要將其轉換為原碼形式,由於符號位為1,為負數,所以我們先對10011轉換為反碼,即11100,再對其進行+1,所以結果為11101,轉換為十進制數則為-13。所以b=-13。

計算機中打印的二進制都是補碼的形式

正數原碼、反碼、補碼 三碼合一 

負數的原碼轉換為補碼為 符號位不變 數值位按位取反 末位加一

負數,補碼的補碼等於原碼  反碼為正 三碼合一

 

(5)右移操作運算規則:左邊空出的位用0或者1填補。正數用0填補,負數用1填補。注:不同的環境填補方式可能不同;低位右移溢出則舍棄該位。

a=127,轉換為二進制為01111111,由於二進制在計算機內部是以補碼的形式進行存儲,但由於127是正數,所以其補碼為01111111,對該補碼進行右移操作運算,按照運算規則,得到00011111,轉換為原碼,依舊為00011111,轉換為十進制數為31,所以,b=31。

對多組數據進行測試,我們可以得到這樣一個規律:
當一個數進行n位的右移操作后,所得到的新的數=被操作數/2^n.
(6)左移運算操作規則:右邊空出的位用0填補,高位左移溢出則舍棄該高位。

a=-127,轉換為二進制為1000 0111 1111,轉換為反碼為1111 1000 0000,轉換為補碼是1111 1000 0001,對其進行左移三位的操作,得到:1100 0000 1000,將其轉換為反碼:1100 0000 0111,再將其轉換為原碼:1011 1111 1000,轉換為十進制數,為-1016,所以b=-1016。
對多組數據進行測試,我們可以得到這樣一個規律:
當一個數進行n位的左移操作后,所得到的新的數=被操作數*2^n.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM