OC中的位运算

Wesley13
• 阅读 848

转载: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
点赞
收藏
评论区
推荐文章
Wesley13 Wesley13
3年前
java中的7个位运算运算符
位运算指的是针对整数的二进制进行的位移操作。位运算提供比算术运算更高的效率,但是位运算的代码可读性较差,建议所有使用位运算的地方写上注释。Java中提供7个位运算符用于位运算。左移(<<)左移运算是将操作数二进制值逐位左移若干位,左移过程中符号位不变,高位溢出则舍弃,低位则补0。范例结果范例结果00000001<<
Wesley13 Wesley13
3年前
Java 位运算(移位、位与、或、异或、非)
//1、左移(<<)//00000000000000000000000000000101然后左移2位后,低位补0:////00000000000000000000000000010100换算成10进制为20System.out.println(5<<2);//运行结果是20//2、右移
Stella981 Stella981
3年前
Python运算符大全
  一、Python的算术运算  Python的算术运算符与C语言类似,略有不同。包括加()、减()、乘(\)、除(/)、取余(%)、按位或(|)、按位与(&)、按位求补(~)、左移位(<<)、右移位()、单目求反()、幂运算(\\)、整除运算(//)、增强运算、增强矩阵乘法(@)。  增强运算是将算术运算符或逻辑运算符放到等号的左
Wesley13 Wesley13
3年前
C语言位运算
位运算应用口诀清零取反要用与,某位置一可用或若要取反和交换,轻轻松松用异或移位运算要点1它们都是双目运算符,两个运算分量都是整形,结果也是整形。        2"<<"左移:右边空出的位上补0,左边的位将从字头挤掉,其值相当于乘2。       3""右移:右边的位被挤掉。对于左边移出的空位,如果是正数则空
Stella981 Stella981
3年前
20180109Java位运算
一,Java位运算1.表示方法:  在Java语言中,二进制数使用补码表示,最高位为符号位,正数的符号位为0,负数为1。补码的表示需要满足如下要求。 (1)正数的最高位为0,其余各位代表数值本身(二进制数)。 (2)对于负数,通过对该数绝对值的补码按位取反,再对整个数加1。 2.位运算符位运算表达式由
可莉 可莉
3年前
20180109Java位运算
一,Java位运算1.表示方法:  在Java语言中,二进制数使用补码表示,最高位为符号位,正数的符号位为0,负数为1。补码的表示需要满足如下要求。 (1)正数的最高位为0,其余各位代表数值本身(二进制数)。 (2)对于负数,通过对该数绝对值的补码按位取反,再对整个数加1。 2.位运算符位运算表达式由
Stella981 Stella981
3年前
JavaScript 位运算笔记
之前一直以为,在js的位运算中,双精度浮点数在内部会先被转成32位整数,再执行位运算,然后再转为64位数值,因此效率极低。今天实验发现,对浮点执行位运算只会导致数值不准确,而不会导致效率低下,相比乘法,左移位要快66%(其实就是浮点运算与整数运算的差距)。以下结果在IE7~IE10上测试得出技巧1:移位运算比乘除法快(当因数是2的幂数)
Wesley13 Wesley13
3年前
C#位运算
在C中可以对整型运算对象按位进行逻辑运算,按位进行逻辑运算的意义是:依次取被运算对象的每个位,进行逻辑运算,每个位的逻辑运算结果是结果值的每个位,C支持的位逻辑运算符如下表。!(https://oscimg.oschina.net/oscnet/e3ff3ca0d8190d7cf6a5c8269feaab32004.jpg)1、位逻辑非运算
Stella981 Stella981
3年前
Codeforces 1208F Bits And Pieces 位运算 + 贪心 + dp
题意:给你一个序列a,问a\i\^(a\j\&a\k\)的最大值,其中i<j<k。思路:我们考虑对于每个a\i\求出它的最优解。因为是异或运算,所以我们从高位向低位枚举,如果这一位a\i\是0,我们就在a\i\的右边找两个位置让它们按位与起来这位是1。那么,我们贪心的保留可以通过按位与凑出某个二进制数的最靠右的两
Wesley13 Wesley13
3年前
Java中关于位运算的面试题
位运算的效率是最高的,因为位位运算是直接对二进制进行操作位运算只能应用于整型和char类型(char类型可以看做是特殊的无符号的整形)面试题:a:判断一个数是否是奇数a&11;b:对2^n取余。a&(2^n1);c:如何判断一个数是否是2^na&(a1)