iOS中位運算符的使用

問題緣起

UIControlState.png

UIButton的狀態設置,相信我們都經常碰見,也很熟悉了。

UIControlStateNormal
UIControlStateHighlighted
UIControlStateDisabled
UIControlStateSelected

這幾個是我們平時開發最經常使用的,但是實際上,這些狀態不止這幾個。如果知道的就可以忽略下面的內容了。
我們一般定義的枚舉,都是使用數字0,1,2......obj-C中枚舉是值類型,如下:

image.png

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中位運算的高級使用

色彩存儲

image.png

關于這個使用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)浮點數,因此可以將十六進制的顏色,分別將RGB的值提取出來換算成十進制然后算出(X/255.0f)浮點數。

位運算應用

這個應用,可以參考文章開篇的問題。使用位運算來定義枚舉類型的值,而不是單純使用整型數字來定義。

位運算加解密

基于位運算中一個巧妙的運算:

a ^= b;
b = a ^ b;
a = a ^ b;

通過異或運算符,對相同二進制位的值置0,將ab合并成單個變量,再分別消除變量中的ab的值。

參考來源

阮一峰的網絡日志----浮點數的二進制表示
sindri的小巢----iOS開發-位運算
茉莉兒----關于位運算看這個就夠了

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

推薦閱讀更多精彩內容

  • 運算符是處理數據的基本方法,用來從現有的值得到新的值。JavaScript 提供了多種運算符,本章逐一介紹這些運算...
    許先生__閱讀 615評論 0 3
  • 運算符是處理數據的基本方法,用來從現有的值得到新的值。JavaScript 提供了多種運算符,本章逐一介紹這些運算...
    徵羽kid閱讀 699評論 0 0
  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執行單位為行(line),也就是一...
    悟名先生閱讀 4,195評論 0 13
  • 背景 在java中float賦值給double,會產生精度問題。 輸出為2.0999999046325684。 小...
    我叫小小強閱讀 19,267評論 2 23
  • 本章將會介紹 模塊和源文件訪問級別訪問控制語法自定義類型子類常量、變量、屬性、下標構造器協議擴展泛型類型別名位運算...
    寒橋閱讀 901評論 0 2