本篇基础:需要你要对正负数的二进制序列的原反补码有所了解。
测试题:
先来一道测试题看看你究竟掌握了没有:
品茗股份有限公司的一道面试题:
不使用第3个变量的情况下,交换2个数的大小。 例如: 交换前:a=3,b=5; 交换后:a=5,b=3;
给你几分钟,如果做不出来的话,就听博主给你娓娓道来。(😇答案在文末)
一. 按(二进制)位操作符
正数和负数需先转换成相应的二进制的补码,再进行移位运算
操作对象:补码
1-1.左移操作符<<(乘法)
🎈用法:
int a=7<<1;//为例
规则:
将a的二进制序列的补码向左移动1位,左边丢弃,右边补0
🎈图示:
🎈代码结果:
1-2.右移操作符>>(除法)
🎈用法:
int a=-7>>1;//为例 • 1
🎈规则:
将a的二进制序列的补码向右移动1位
至于后续操作是什么呢?以下有如下两种公认的两种说法:
算术右移:右边丢弃,左边补原符号位
逻辑右移:右边丢弃,左边补0
🎈图示:
🎈代码结果:(我的编译器支持的是算术右移)
1-3.除乘二小技巧
🎈备注:按位操作符:
按位操作的正数m<<位移的位数n = m乘以2的n次方 按位操作的正数m>>位移的位数n = m除以2的n次方
🎈最常用的当然是乘2除2的操作:(这个的运行是时间比/*2快,推荐使用)
🎈代码结果:
二.(二进制)位操作符
操作对象:补码
2-1按位与&(类似乘法)
🎈技巧:
相当于乘法
🎈规则:
只有两个数的二进制的补码同时为1,结果才为1,否则为0
用法:
int c=3&5;//为例 printf("%d",c);
图示:
🎈代码结果:
2-2.按位或(类似加法)
🎈技巧:
相当于加法
🎈规则:
只有两个数的二进制的补码同时为0,结果才为0,否则为1
刷题技巧:
- 👌 0|5,0|7 任何数和0|保持不变
- 👌 1|5,1|7 任何数和1|被设置为1
🎈用法:
int c=3 | 5;//为例 printf("%d",c);
图示:
🎈代码结果: