&和&&以及左右移运算符

&或者|是位运算,&&和||是逻辑运算;比如: 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的方法来实现

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。