OC中的位运算

原创
2018/07/10 16:02
阅读数 201

转载:https://www.jianshu.com/p/b868b30c0c88

OC中的位运算和C/C++语言的位运算是一样的。一般有 &(按位与),| (按位或),~ (按位取反),<<(左移) ,>>(右移),^(异或)以及 &= (按位与然后赋值),|= (按位或然后赋值)等
对枚举类型的操作中常常会见到。
例如定义一个季节SeasonType的枚举,有春夏秋冬四个值。

typedef NS_OPTIONS(NSInteger, SeasonType) {
    //bitmask (位掩码):1111
    SeasonSpring        = 1 << 0,   //春天    0001  '<<'左移运算
    SeasonSummer        = 1 << 1,   //夏天    0010
    SeasomAutumn        = 1 << 2,   //秋天    0100
    SeasonWinter        = 1 << 3,   //冬天    1000
};

你可以执行下面的操作

//定义一个SeasonType表示春夏两个季节
SeasonType seasonType =  SeasonSpring | SeasonSummer;
//对应的进行按位或运算seasonType = 0001 | 0010 = 0011 

//添加冬季
seasonType = seasonType | SeasonWinter;
或者
seasonType  |= SeasonWinter;
//对应的进行按位或运算seasonType = 0011 | 1000 = 1011
//此时seasonType同时表示了三种枚举分别是春、夏、冬

//如果再把冬季去掉可以这样
seasonType = seasonType & ~SeasonWinter;
或者
seasonType &= ~SeasonWinter;
//对应的运算为 seasonType = 1011 & (~1000) = 1011 & 0111 = 0011;
//此时seasonType又只表示了春夏两个季节。

位运符之间的优先级顺序(从高到低)为:

1  ~
2  <<、>>
3  &
4  ^
5  |
6  &=、^=、|=、<<=、>>=

关于异或运算我想到一个题

如何不借助第三个变量(中间变量),来交换两个数的值

此时就可以用位运算中的异或(按位对比,相同取0,不同取1)来解决

//定义a, b
int a = 1, b = 2;
// a = 0001 , b = 0010
//经过三步就可以交换a,b的值
a = a ^ b;  // a = 0001 ^ 0010 = 0011
b = a ^ b;  // b = 0011 ^ 0010 = 0001
a = a ^ b;  //  a = 0011 ^ 0001 = 0010
//交换成功
//简写的话是这样
//a ^= b;
//b ^= a;
//a ^= b;
//即a = a ^ b 等价于a ^= b

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
在线直播报名
返回顶部
顶部