欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

&& 和 & 的区别 , | 和 || 的区别

程序员文章站 2024-03-22 10:24:28
...

&&

逻辑与运算
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 进行比较 , 效率就稍微降低了。
不过 和业务逻辑 ,还有有时候简化代码的情况相比较这些效率也算不了多少。看情况使用就好了。

至于 || 和 | 的问题同上