最近做每日一题,大神用位运算秀的操作,真的是秀我一脸,为此我特地做了位运算的小笔记,以供日后参考。😋!
运算符次序问题:C++运算符优先级
有大佬的话,给补充下呀!😉
(一)概念
按位与(&):两数对应位均为1,结果为1,其他为0
按位或(|):两数对应位均为0,结果为0,其他为1
按位异或(^):两数对应位同0异1
按位取反(~):所有位上,1变0, 0变1
左移(<<):运算时,所有1往左移,空出的位补0。计算m 乘 2的n次方很方便,m << n
右移(>>):运算时,所有1往右移,空出的位补符号位。同理,m 除 2的n次方很方便,m >> n
注意:计算机运算是以二进制进行,相比普通加减乘除,用位运算应该可以快一丢丢。
(二)用法
(1)整数取余(按2 ^ n)
m & ((1 << n) - 1); //m 按2 ^ n取余,外侧括号可省略,内侧括号不可省略
因为2的次方的二进制表示为1000…,所以m中对应位后面不为0的都是余数,通过按位与运算可以取余。
(2)判定整数奇偶性
二进制逢二进位,所以最后一位决定了这个数的奇偶性,直接按位与1就可以判断这个数的奇偶性。
bool isOdd(int num)
{
return num & 1 == 1;//奇数时为1,偶数时为0
}
(3)交换两个整数(不使用临时变量)
//交换a,b
a = a ^ b;
b = b ^ a;
a = a ^ b;
//或者用这个
a ^= b ^= a ^= b;//可读性不好,但有点帅hh
目前我能碰到和用到的,暂时就是这些,如果有碰到大佬们的骚操作,再补充!😏