按位與(&)按位或(|)按位異或(^)按位取反(~)左移(<<)

看源碼期間遇到了取反(~),就做個記錄。

基礎(chǔ)知識:

1. and(&)運(yùn)算 (按位與)

and運(yùn)算通常用于二進(jìn)制取位操作,例如一個數(shù) and 1的結(jié)果就是取二進(jìn)制的最末位。這可以用來判斷一個整數(shù)的奇偶,二進(jìn)制的最末位為0表示該數(shù)為偶數(shù),最末位為1表示該數(shù)為奇數(shù).
  相同位的兩個數(shù)字都為1,則為1;若有一個不為1,則為0。
  00111
  11100
  (&或者and)
  ----------------
  00100

2. or(|)運(yùn)算 (按位或)

or運(yùn)算通常用于二進(jìn)制特定位上的無條件賦值,例如一個數(shù)or 1的結(jié)果就是把二進(jìn)制最末位強(qiáng)行變成1。如果需要把二進(jìn)制最末位變成0,對這個數(shù)or 1之后再減一就可以了,其實(shí)際意義就是把這個數(shù)強(qiáng)行變成最接近的偶數(shù)。
  相同位只要一個為1即為1。
  00111
  11100
  (|或者or)
  ----------------
  11111

3. xor(^)運(yùn)算 (按位異或)

異或的符號是⊕。
  xor運(yùn)算通常用于對二進(jìn)制的特定一位進(jìn)行取反操作,因?yàn)楫惢蚩梢赃@樣定義:0和1異或0都不變,異或1則取反。
  xor運(yùn)算的逆運(yùn)算是它本身,也就是說兩次異或同一個數(shù)最后結(jié)果不變,即(a xor b) xor b = a。xor運(yùn)算可以用于簡單的加密,比如我想對我MM說1314520,但怕別人知道,于是雙方約定拿我的生日19880516作為密鑰。1314520 xor 19880516 = 20665500,我就把20665500告訴MM。MM再次計(jì)算20665500 xor 19880516的值,得到1314520,于是她就明白了我的企圖。
  相同位不同則為1,相同則為0。
  00111
  11100
  (^或者xor)
  ----------------
  11011

4.~取反

就是如果是00111,則變?yōu)?1000 (按位取反)

~是按位取反的意思.
57的二進(jìn)制表示為(1個字節(jié)):00111001
按位取反后(~57)的二進(jìn)制: 11000110 此表示為十進(jìn)制:-70
這是一個負(fù)數(shù),是有符號的數(shù),負(fù)數(shù)在計(jì)算機(jī)里要用其補(bǔ)碼來表示:補(bǔ)碼=符號位以后按位取反再加1.
所以-70(11000110)符號位以后按位取反后為(10111001) 再加1 則為(10111010)
換成十進(jìn)制為:-58
因此~57=-58

5.>>是右移位運(yùn)算

右移1位即除以2;,并且取整。
m_Height>>4相當(dāng)于:
m_Height/16

6.<<是左移位運(yùn)算

若左移一位,則其數(shù)值變?yōu)?a*2

今日又看到這樣的表達(dá),a|=b ,意思是a=(a|b),這與 a+=b有點(diǎn)類似。例子如下:

int a = 1,b = 2,c = 4;//0x0001,0x0010,0x0100
a |= b;// a = 0x0011 = 3
b |= c;// b = 0x0110 = 6

這種表達(dá)很有用,這個方式在很多需要一個值標(biāo)識多種狀態(tài)下普遍適用。參見 http://bbs.csdn.net/topics/380232699

原文:https://blog.csdn.net/zhongjling/article/details/8004103

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容