函数(二十)操作符深入学习(二)

一    运算符

按'二进制位'进行'位'操作,对应的'二进制'位

重点: 相应操作数的'补码'进行'位'操作

需求: 判断两个'整数'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次'
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值