ビットマスクの判定法[Swift]
ビットマスクでどのフラグが立っているのか知りたい場合の方法
例えば、NSWindowのどのボタンが有効になっているか、タイトルバーはあるのかが知りたい場合はNSWindowのstyleMaskプロパティで知ることができるが、返されるのはIntなので、どのフラグが立っているのかはすぐにはわからない。
そこでビット演算。NSResizableWindowMaskは整数値で、10進数では8、2進数では1000となる。
Swift上で2進数を表すのには「0b」をつければ良いので0b1000となる。
let flag4 = (window.styleMask & 0b001000) >> 3
仮にwindow.styleMaskの値が9だったとしよう。
10進数の9は2進数では1001なのでSwift上では0b1001となる。
ANDの演算(両方1だったら1、それ以外は0)を行うと
1001 & 1000
縦に並べてみると
1001 &
1000
-
-
-
-
-
-
- -
-
-
-
-
-
1000
となる。
そのあとビットのシフト(移動)を行う。
1000 >> 3
3桁右へ移動するので
0001となる。
つまり10進数で1の値となる。
Swiftではifの判定にはIntではダメらしいのでBoolにしてやらないといけない。
if (((window.styleMask & 0b001000) >> 3)>0){ NSLog("NSResizableWindowMask") }
これで、指定した位置のフラグが立っているかどうかっていうのがわかる
//NSWindow styleMask @IBAction func function003(sender: AnyObject) { var window : NSWindow = NSWindow( contentRect: NSMakeRect(0.0, 0.0, 300, 200), styleMask: NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask, backing: .Buffered, defer: false) windowArray.addObject(window) //ウインドウを保持するための入れるに追加。アプリ終了時に配列は破棄 window.center()//ウインドウをスクリーンんの中心に window.title = "ウインドウタイトル"//タイトル設定 window.orderFront(self)//前面に window.makeKeyAndOrderFront(self)//表示 //let flag5 = (window.styleMask & 0b010000) >> 4 //let flag4 = (window.styleMask & 0b001000) >> 3 //NSResizableWindowMask //let flag3 = (window.styleMask & 0b000100) >> 2 //NSMiniaturizableWindowMask //let flag2 = (window.styleMask & 0b000010) >> 1 //NSClosableWindowMask //let flag1 = (window.styleMask & 0b000001) //NSTitledWindowMask if ((window.styleMask & 0b000001)>0){ NSLog("NSTitledWindowMask") } if (((window.styleMask & 0b000010) >> 1)>0){ NSLog("NSClosableWindowMask") } if (((window.styleMask & 0b000100) >> 2)>0){ NSLog("NSMiniaturizableWindowMask") } if (((window.styleMask & 0b001000) >> 3)>0){ NSLog("NSResizableWindowMask") } }
関連記事(外部サイト)
The Swift Programming Language: Advanced Operators
0xFFAABB形式のデータから各コンポーネントの値を得るようなコードが有る。
The Swift Programming Language: Advanced Operators