题意: 给定两个整数, 计算从一个整数需要翻转几个位才能到另一个整数.
比如: 给定29 二进制为11101 和 15, 二进制是01111, 则答案是2次.
这题的关键就是用 XOR 异或来获得两个整数不同位. 因为只有当两个位不一样的时候 异或的结果才是1. 所以我们可以写成以下循环, 每次向右移1位, 累计 c & 1
1 2 3 4 5 6 7 | int bitSwapRequired(int a, int b) { int count = 0; for (int c = a^b; c != 0; c >>>= 1) { count += c & 1; } return count; } |
int bitSwapRequired(int a, int b) { int count = 0; for (int c = a^b; c != 0; c >>>= 1) { count += c & 1; } return count; }
我们还可以稍微改进一下, 就是用 x & (x – 1) 来移除最右边的那个1. 这样循环可以写成:
1 2 3 4 5 6 7 | int bitSwapRequired(int a, int b) { int count = 0; for (int c = a^b; c != 0; c &= (c - 1)) { count ++; } return count; } |
int bitSwapRequired(int a, int b) { int count = 0; for (int c = a^b; c != 0; c &= (c - 1)) { count ++; } return count; }
这题还是在初面的时候挺常见的, 也是较简单, 但是如果没有看过当场还不一定想出一个很好的方法.
英文: C Coding Exercise – Flip the Integers (Bit Manipulation)
强烈推荐
- 英国代购-畅购英伦
- TopCashBack 返现 (英国购物必备, 积少成多, 我2年来一共得了3000多英镑)
- Quidco 返现 (也是很不错的英国返现网站, 返现率高)
- 注册就送10美元, 免费使用2个月的 DigitalOcean 云主机(性价比超高, 每月只需5美元)
- 注册就送10美元, 免费使用4个月的 Vultr 云主机(性价比超高, 每月只需2.5美元)
- 注册就送10美元, 免费使用2个月的 阿里 云主机(性价比超高, 每月只需4.5美元)
- 注册就送20美元, 免费使用4个月的 Linode 云主机(性价比超高, 每月只需5美元) (折扣码: PodCastInit2022)
- PlusNet 英国光纤(超快, 超划算! 用户名 doctorlai)
- 刷了美国运通信用卡一年得到的积分 换了 485英镑
- 注册就送50英镑 – 英国最便宜最划算的电气提供商
- 能把比特币莱特币变现的银行卡! 不需要手续费就可以把虚拟货币法币兑换
微信公众号: 小赖子的英国生活和资讯 JustYYUK