看源碼期間遇到了取反(~)秸侣,就做個記錄。
基礎(chǔ)知識:
1. and(&)運算 (按位與)
and運算通常用于二進制取位操作,例如一個數(shù) and 1的結(jié)果就是取二進制的最末位。這可以用來判斷一個整數(shù)的奇偶,二進制的最末位為0表示該數(shù)為偶數(shù),最末位為1表示該數(shù)為奇數(shù).
相同位的兩個數(shù)字都為1,則為1;若有一個不為1宵蕉,則為0。
00111
11100
〗诎瘛(&或者and)
----------------
00100
2. or(|)運算 (按位或)
or運算通常用于二進制特定位上的無條件賦值羡玛,例如一個數(shù)or 1的結(jié)果就是把二進制最末位強行變成1。如果需要把二進制最末位變成0宗苍,對這個數(shù)or 1之后再減一就可以了稼稿,其實際意義就是把這個數(shù)強行變成最接近的偶數(shù)薄榛。
相同位只要一個為1即為1。
00111
11100
∪眉摺(|或者or)
----------------
11111
3. xor(^)運算 (按位異或)
異或的符號是⊕敞恋。
xor運算通常用于對二進制的特定一位進行取反操作,因為異或可以這樣定義:0和1異或0都不變谋右,異或1則取反硬猫。
xor運算的逆運算是它本身,也就是說兩次異或同一個數(shù)最后結(jié)果不變改执,即(a xor b) xor b = a啸蜜。xor運算可以用于簡單的加密,比如我想對我MM說1314520辈挂,但怕別人知道衬横,于是雙方約定拿我的生日19880516作為密鑰。1314520 xor 19880516 = 20665500终蒂,我就把20665500告訴MM冕香。MM再次計算20665500 xor 19880516的值,得到1314520后豫,于是她就明白了我的企圖。
相同位不同則為1突那,相同則為0挫酿。
00111
11100
(^或者xor)
----------------
11011
4.~取反
就是如果是00111愕难,則變?yōu)?1000 (按位取反)
~是按位取反的意思.
57的二進制表示為(1個字節(jié)):00111001
按位取反后(~57)的二進制: 11000110 此表示為十進制:-70
這是一個負數(shù),是有符號的數(shù),負數(shù)在計算機里要用其補碼來表示:補碼=符號位以后按位取反再加1.
所以-70(11000110)符號位以后按位取反后為(10111001) 再加1 則為(10111010)
換成十進制為:-58
因此~57=-58
5.>>是右移位運算
右移1位即除以2早龟;,并且取整猫缭。
m_Height>>4相當于:
m_Height/16
6.<<是左移位運算
若左移一位葱弟,則其數(shù)值變?yōu)?a*2
今日又看到這樣的表達,a|=b 猜丹,意思是a=(a|b)芝加,這與 a+=b有點類似。例子如下:
int a = 1,b = 2,c = 4;//0x0001,0x0010,0x0100
a |= b;// a = 0x0011 = 3
b |= c;// b = 0x0110 = 6
這種表達很有用射窒,這個方式在很多需要一個值標識多種狀態(tài)下普遍適用藏杖。參見 http://bbs.csdn.net/topics/380232699