一 位运算符
按'二进制位'进行'位'操作,对应的'二进制'位
重点: 相应操作数的'补码'进行'位'操作
需求: 判断两个'整数'a、b'是否相等',则可通过'下列语句'实现:
return ( (a ^ b) == 0)
(1)案例1
(2)案例2
需求: 不'创建'临时变量('第三个变量'),实现两个数的'交换'
① 使用第三方变量
② 加减法
缺点: 由于a和b都是整数,'4个字节','空间有限';'a+b'可能会'溢出'
③ 异或
说明: 不会'溢出'
(3)案例3
需求: 求'一个整数'存储在'内存中'的'二进制'中'1'的个数
补充: 这里'假定'是'int类型'的整数
备注: 内存中'存储'的是'补码'
① 方式1
'num % 2' 取二进制中'最低'的比特位
说明: '正数'可以,但是'负数'不行
② 方式2
原理: 假定'不指定'整数的'类型'
循环:判断'补码'对应的'二进制'位是否为1
'原码': 10000000 00000000 00000000 00000001 -->'-1'
'反码': 11111111 11111111 11111111 11111110
'补码': 11111111 11111111 11111111 11111111 -->'32'个1
③ 方式3
优化: 上面'必须循环'32次的,是否'必须'循环这么多次?
假设:num的'二进制序列'为1111
count --> '1'
(num) ----------- 1111
(num-1) ----------- 1110
'第一次': num=num&(num-1)
count --> '2'
(num) ----------- 1110
(num-1) ----------- 1101
'第二次': num=num&(num-1)
count --> '3'
(num) ----------- 1100
(num-1) ----------- 1001
'第三次': num=num&(num-1)
count --> '4'
(num) ----------- 1000
(num-1) ----------- 0111
'第四次': num=num&(num-1) -->'0'
备注:只要'不是0',进入'循环',说明'至少'有一个二进制位'1'.
细节:我们不难看出每次"num=num&(num-1)"之后,num的'二进制序列'都会'少一个1',直至'循环'到num为0时,'count'就是二进制中1的'个数'.
该方法的'效率最高',比较'推荐' --> 有'几个二进制1'就会判断'几次',而不是'32次'