原碼,反碼,補碼以及位運算

在計算機內,有符號數有3種表示法: 原碼,反碼,和補碼.所有數據的運算都是採用補碼進行的.

原碼       就是二進制定點表示法,即最高位爲符號位,”0”表示正,”1”表示負,其位表示數值的大小.
反碼       正數的反碼與其原碼相同,負數的反碼是對其原碼逐位取反,但符號位除外.
補碼       正數的補碼與其原碼相同,負數的補碼是在其反碼的末位加1.

更好的理解,用原碼,反碼,補碼來分別表示+6和-6

原碼    正數的原碼最高位是 0,負數的原碼最高位是 1 ,
           其位表示數值的大小.         

           符號位        數值位     
      +6    0        0000110
      - 6    1        0000110

反碼    正數的反碼與原碼相同'         
           負數的反碼與原碼符號位相同,數值位取反(就是1變0,0變1).              

          符號位        數值位     
     +6    0        0000110   
     - 6    1        1111001

補碼    正數的反碼與原碼相同.         
            負數的補碼是在反碼的基礎上加1.              

         符號位        數值位     
      +6    0        0000110   
      - 6    1        1111010

位運算符     & ,  | ,  ^ ,  ~

int a = 6; int b = 3;  求 a&b ,a|b , a^b , ~6;

6的二進制: 110        
原碼: 00000000 00000000 00000000 00000110        
3的二進制: 11        
原碼: 00000000 00000000 00000000 00000011    

用6和3的補碼運算得到: &: 位與運算 (有0則0)        
6&3: 00000000 00000000 00000000 00000010               //2
| : 位或運算(有1則1)        
        6|3 :  00000000 00000000 00000000 00000111            //7
^ : 位異或運算(相同則0,不同則1)        
        6^3: 00000000 00000000 00000000 00000101            //5
~:按位取反運算符(0變1,1變0)        
        ~6  : 11111111 11111111 11111111 11111001 (補碼)                    
                11111111 11111111 11111111 11111000  (反碼)                
                00000000 00000000 00000000 00000111  (原碼)      //-7

位移運算符        << 左移    ,左邊最高位丟棄,右邊補齊0,             
                          >> 右移,最高位是0,左邊補齊0;最高位是1,左邊補齊1           
                          >>>無符號右移,無論最高位是0還是1,左邊補齊0

int i = 6; int k =8; 求 i<<1  ,i>>1 , k<<2 , k>>2 ;     
          6的二進制: 110     
          原碼: 00000000 00000000 00000000 00000110     
          8的二進制: 1000     
          原碼: 00000000 00000000 00000000 00001000

<<左移: 把<<左邊的數據乘以2的移動次冪            
          6<<1: (0)0000000 00000000 00000000 000001100    //12            
          8<<2: (00)000000 00000000 00000000 0000100000    //32

>>右移: 把>>左邊的數據除以2的移動次冪            
          6>>1:   000000000 00000000 00000000 0000011(0)    //3    
          8>>2:  0000000000 00000000 00000000 000010(00)    //2

int i = 24; int k = -24; 求 i >>2, k>>2, i>>>2, k>>>2;     
        24的二進制: 11000     
        原碼: 00000000 00000000 00000000 00011000     
        -24的原.反.補碼         
        原碼: 10000000 00000000 00000000 00011000     
        反碼: 11111111 11111111 11111111 11100111     
        補碼: 11111111 11111111 11111111 11101000
   24>>2 = 6

  -24>>2 :  11111111 11111111 11111111 111010(00)    (補碼)     
                  11111111 11111111 11111111 111001    (反碼)     
                  10000000 00000000 00000000 000110    (原碼)     // -6

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章