&&
逻辑与运算
eg:(a&&b )
a = 1 , b = 1 表达式 值则为1 (这里面的1(非0)表示true , 0 则为true)
a = 0, b = 1 表达式则为0
类比数学的话,就是高中数学里面的 ‘与’
&
按位与
eg:(a&b)
a = 9 , b = 8 转换为二进制
a = b + 1 (1001) , b = 1000 (a & b) = 1000 => 8(十进制) 所以值判断为非0
<<
代表二进制情况下左移
eg:
1 << 0 , 0001 =>(左移0) 0001(十进制1)
1 << 1 , 0001 =>(左移1)0010 (十进制的2)
1 << 2 , 0001 => (左移2)0100(十进制4)
|
和 ||
|
按位或
a | b
a = 8 (1000), b = 9(1001) => 1001(9)
||
逻辑或
a || b
类比高中数学里面讲的 (或)
应用:(针对iOS的)
枚举时:
typedef NS_OPTIONS(NSUInteger, UIRectEdge) {
UIRectEdgeNone = 0, //(0000)
UIRectEdgeTop = 1 << 0,//(0001)
UIRectEdgeLeft = 1 << 1,//(0010)
UIRectEdgeBottom = 1 << 2,//(0100)
UIRectEdgeRight = 1 << 3,//(1000)
UIRectEdgeAll = UIRectEdgeTop | UIRectEdgeLeft | UIRectEdgeBottom | UIRectEdgeRight //(1111)
}
description:恰当的表达了每一种情况的的唯一性
使用时:
个人认为使用的环境应为,同一个对象,有处理多个处于平行的关系的业务逻辑的能力,并且他们几个互相没有顺序的影响。如果有逻辑上的先后顺序,也可以通过if的顺序来解决。不过第二种情况个人不赞成使用。
UIRectEdge type = UIRectEdgeAll
if (type & UIRectEdgeTop) {
// UIRectEdgeTop 类型
}
UIRectEdge type = UIRectEdgeTop
if (type & UIRectEdgeTop) {
// UIRectEdgeTop 类型
}
if (type & UIRectEdgeBottom) {
//0001 & 0100 始终进不来
}
综上所述:
NS_option 一般情况下 和 ‘&’ 按位与搭配使用
关于效率问题 的取舍
&& 和 &
a&&b:我们一般情况下如果a为假 , 那么我们就不去判断b了
a&b :a为假 我们还会去和b 进行比较 , 效率就稍微降低了。
不过 和业务逻辑 ,还有有时候简化代码的情况相比较这些效率也算不了多少。看情况使用就好了。
至于 || 和 | 的问题同上