原文链接
https://www.acwing.com/blog/content/873/
https://blog.csdn.net/m0_37345402/article/details/77429245
-
右移运算符 (需要移位的数字 >> 移位的次数)
将需要移位的数字转化成二进制,将转化完的数字整体向右移动对应位移位数,低位舍弃,高位的空位补符号位(正数补零,负数补1)。
例:12 >> 2
12的二进制为1100,将1100整体右移两个单位,因为12为正数,高位填零,变成0011,是十进制中的3.
12>>1就是除以2, 12>>2就是除以4 -
左移运算符 (需要移位的数字 << 移位的次数)
将需要移位的数字转化成二进制,将转化完的数字整体向左移动对应位移位数,高位舍弃,低位的空位补0.
例:5<<2
5的二进制为0101,将0101整体左移两个单位,低位补0,得10100,十进制中的20。
在进行移位的时候,可能存在溢出问题。 -
/——
除法
结果=被除数/除数
被除数 除数 结果
浮点数 浮点数 浮点数
浮点数 整数 浮点数
整数 整数 整数
整数 浮点数 浮点数注:5/2的值为2(整除),而用(double)5/2的值则为2.5。
5%2=1(取余) -
>>
和/
的区别:- 操作对象类型不同
>>
只有整数才能使用
/
整数和浮点数都能够使用。 - 运算效率不同
通常情况下,右移操作比整数除法快。但涉及到浮点数的除法速度是最慢的。 - 优先级不同
>>
比/
的优先级低,两者同时参与运算,先计算乘除,后计算左移或右移。
- 操作对象类型不同
n&1
与运算 可以判断n是否为偶数 如果是偶数,n&1返回0;否则返回1,为奇数。
关于位运算符
1.int 上限为2^31-1,无穷大的数可以设置为(1<<31)-1(加括号因为位运算符优先级低于算术运算符)
更常用的是2^30-1,可以避免相加超过int的情况。
const int INF=(1<<30)-1;
const int INF= 0x3fffffff;