&或者|是位运算,&&和||是逻辑运算;比如: int temp = (6&4);
6的二进制是110,4的二进制是100,两者按位并得到100即为4;如果为6&&4因为两个都大于0所以其值为1。
左移和右移:
左移(<<):将一个运算对象的各二进制位全部左移若干位(左边的二进制丢弃,右边补0)
右移(>>):将一个运算对象的各二进制位全部右移若干位,正数左补0,负数左补1.
正数的左移(<<)和右移(>>)(以3为例)
3的二进制为00000011
右移2位的时候将最右的11去掉左边补00结果为:00000000 --- >十进是中的0
左移2位的时候将最左的00去掉右边补00结果为:00001100 ----->十进是中的12
负数左右移不太常用。。。
补充几个常用的:
1<<0 是把1 按2进制 左移0位 结果还是1;
1<<1 10;
1<<2 100;
1<<3 1000
1000>>1 0100
使用层面的理解:
如果我们在枚举值中看见<<那我们就可以通过|(位运算符:或)进行组合使用如下代码为例:
//随便添加一个UITextField
UITextField*field = [UITextField new];
//Begin,Changed,DidEnd都能触发UITextField的事件
[field addTarget:selfaction:@selector(textFieldDidChanged) forControlEvents:UIControlEventEditingDidBegin|UIControlEventValueChanged|UIControlEventEditingDidEnd];
[self.view addSubview:field];
如果枚举值中没有<<,这就是普通的NSInteger类型的枚举, 所以不能组合使用;
那苹果官方是怎么知道我们多个条件组合使用了呢? 答案是通过&(位运算符:与)进行判断的:
举例
NSUInteger controlEvents = UIControlEventEditingDidBegin|UIControlEventEditingDidEnd;
if (controlEvents&UIControlEventEditingDidBegin) {
NSLog(@"UIControlEventEditingDidBegin");
}
if (controlEvents&UIControlEventEditingDidEnd){
NSLog(@"UIControlEventEditingDidEnd");
}
if (controlEvents&UIControlEventValueChanged){
NSLog(@"UIControlEventValueChanged");
}
输出:UIControlEventEditingDidBegin,UIControlEventEditingDidEnd
UIView+WebCache
UIImageView+webCache和UIBUtton+webCache使用了UIView+webCache的方法来实现