天天看點

<< 和 >> 在 C++ 裡面是什麼意思原碼反碼補碼<< (左移):x<<y==x*(2^y)<< (右移):x>>y==x/(2^y)後記

原碼反碼補碼

在其之前我們要先了解計算機裡面的三種機械數

計算機都是通過數字的補碼進行運算

  1. 原碼

原碼是人類的正常了解方式的二進制,即首位表示的是正負号,其餘位表示的是數值。

  1. 反碼

    負數的反碼是除了符号位不變其餘的0變1,1變0,正數的反碼還是它本身

  2. 補碼

負數的補碼是除了符号位不變其餘的0變1,1變0,最後在再1,正數的反碼還是它本身

<< (左移):x<<y==x*(2^y)

左移就是将二進制的每一個數都往左移動一位,高位舍去,低位補0

栗子:

  1. 1<<1

原碼:000000001

第一步:反碼:00000001

第二步:補碼:00000001

第三步:移動:00000010

第四步:反碼:00000010

第五步:原碼:00000010

也就是1*(2^1)=2

  1. -3<<2

原碼:10000011

第一步:反碼:11111100

第二步:補碼:11111101

第三步:移動:11110100

第四步:反碼:11110011

第五步:原碼:10001100

(因為負數的補碼是最後+1,是以再往原碼轉化的時候應該-1)

也就是-3*(2^2)=-12

<< (右移):x>>y==x/(2^y)

右移就是将二進制的每一個數都往右移動一位,高位補1,低位舍去
  1. 15>>2

原碼:00001111

第一步:反碼:00001111

第二步:補碼:00001111

第三步:移動:00000011

第四步:反碼:00000011

第五步:原碼:00000011

也就是15/(2^2)=3

  1. -4>>2

原碼:10000100

第一步:反碼:11111011

第二步:補碼:11111100

第三步:移動:11111111

第四步:反碼:11111110

第五步:原碼:10000001

也就是-4/(2^2)=-1

後記

這個知識其實之前我并不是很了解,之前隻是知道這有什麼作用,但是并沒有弄懂他為什麼是這樣運算的,但是今天被一個好朋友問起來,當時我隻是把怎麼用給她說了說,但是并不知道她那書上和我了解了恰恰相反。。是以就去網上查閱了相關資料,才緻使沒有翻車。。

繼續閱讀