問題緣起
UIButton
的狀態設置,相信我們都經常碰見,也很熟悉了。
UIControlStateNormal
UIControlStateHighlighted
UIControlStateDisabled
UIControlStateSelected
這幾個是我們平時開發最經常使用的,但是實際上,這些狀態不止這幾個。如果知道的就可以忽略下面的內容了。
我們一般定義的枚舉,都是使用數字0,1,2......obj-C
中枚舉是值類型,如下:
UIControlContentHorizontalAlignment
這個枚舉就只有6個值,按照我這么說,難道UIControlState
的枚舉,就不止列出來的幾個值嗎?恭喜你,猜對了!
不知道你們注意到沒有,UIControlState
的枚舉定義,使用了<<
位運算符。
下面我們就拿UIControlState
來舉例:
(先換算成4位的二進制數) (然后換算回10進制)
UIControlStateNormal = 0, = 0000 , = 0
UIControlStateHighlighted = 1 << 0, = 0001 , = 1
UIControlStateDisabled = 1 << 1, = 0010 , = 2
UIControlStateSelected = 1 << 2, = 0100 , = 4
UIControlStateFocused = 1 << 3, = 1000, = 8
當我換算成了10進制數的時候,是不是已經直觀的看出,其實UIControlState
是真的不止你們看到的那幾種狀態。
你們可以:
UIControlStateSelected | UIControlStateHighlighted
= 5,可以用來表示狀態從高亮到選中時候的狀態
UIControlStateDisabled | UIControlStateHighlighted
= 3,可以用來表示從高亮到非選中的狀態
問題追根溯源-計算機中的位運算
計算機中,只有高低電平,我們人類就使用1/0
去記錄這兩種狀態。于是,我們就需要使用1/0
這種二進制方式去和計算機溝通。
而上面說的位運算,其實是針對二進制數的一種運算。
位運算符有:
"<<" 二進制數全部往左移動N位
">>" 二進制數全部往右移動N位
"|" 兩個二進制數每一位數做或運算
"&" 兩個二進制數每一位數做與運算
"~" 二進制數每一位數取反
"^" 兩個二進制數每一位做異或運算
iOS中位運算的高級使用
色彩存儲
關于這個使用6位16進制數來表達一個顏色值的轉換方法,相信經常用,但是卻沒有仔細看或者仔細想這個方法是如何實現。
- (UIColor *)colorWithHex:(long)hexColor alpha:(float)opacity
{
//將傳入的十六進制顏色0xffa131 轉換為UIColor
float red = ((hexColor & 0xFF0000) >> 16)/255.0f;
float green = ((hexColor & 0xFF00) >> 8)/255.0f;
float blue = (hexColor & 0xFF)/255.0f;
return [UIColor colorWithRed:red green:green blue:blue alpha:opacity];
}
作者:茉莉兒
鏈接:http://www.lxweimin.com/p/25ddeb1d9adf
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權并注明出處。
+ (UIColor *)colorWithRed:(CGFloat)red green:(CGFloat)green blue:(CGFloat)blue alpha:(CGFloat)alpha;
這個是蘋果給的制造UIColor
的類方法,RGB
三個參數都是需要傳入一個(X/255.0f)浮點數,因此可以將十六進制的顏色,分別將R
,G
,B
的值提取出來換算成十進制然后算出(X/255.0f)浮點數。
位運算應用
這個應用,可以參考文章開篇的問題。使用位運算來定義枚舉類型的值,而不是單純使用整型數字來定義。
位運算加解密
基于位運算中一個巧妙的運算:
a ^= b;
b = a ^ b;
a = a ^ b;
通過異或運算符,對相同二進制位的值置0,將a
和b
合并成單個變量,再分別消除變量中的a
和b
的值。
參考來源
阮一峰的網絡日志----浮點數的二進制表示
sindri的小巢----iOS開發-位運算
茉莉兒----關于位運算看這個就夠了