【刷题总结】巧用位运算——一行代码判断一个数是不是 2 的幂(C++实现)

写在前面:
🌟 欢迎光临 清流君 的博客小天地,这里是我分享技术与心得的温馨角落。📝
个人主页清流君_CSDN博客,期待与您一同探索 移动机器人 领域的无限可能。

🔍 本文系 清流君 原创之作,荣幸在CSDN首发🐒
若您觉得内容有价值,还请评论告知一声,以便更多人受益。
转载请注明出处,尊重原创,从我做起。

👍 点赞、评论、收藏,三连走一波,让我们一起养成好习惯😜
在这里,您将收获的不只是技术干货,还有思维的火花

📚 系列专栏:【刷题总结】系列,带您深入浅出,领略编程之美。🖊
愿我的分享能为您带来启迪,如有不足,敬请指正,让我们共同学习,交流进步!

🎭 人生如戏,我们并非能选择舞台和剧本,但我们可以选择如何演绎 🌟
感谢您的支持与关注,让我们一起在知识的海洋中砥砺前行~~~

一、题目描述

判断一个数是不是 2 2 2 的幂

二、编程思路

  可以通过判断这个数与其减一的结果的按位与操作是否为 0 0 0 来判断它是否是 2 2 2 的幂。如果结果是 0 0 0,那么这个数就是 2 2 2 的幂。

三、代码实现

bool isPowerOfTwo(int n) { 
	return n > 0 && (!(n & (n - 1))); 
}

四、程序详解

  在理解这个判断方法之前,我们需要了解一些二进制和位操作的基础知识。
  首先,任何 2 2 2 的幂在二进制表示中只有一个位是 1 1 1,其余都是 0 0 0 。例如:

  • 2 0 = 1 2^0 = 1 20=1 二进制表示为 0001 0001 0001
  • 2 1 = 2 2^1 = 2 21=2 二进制表示为 0010 0010 0010
  • 2 2 = 4 2^2 = 4 22=4 二进制表示为 0100 0100 0100
  • 2 3 = 8 2^3 = 8 23=8 二进制表示为 1000 1000 1000

  当从 2 2 2 的幂减去 1 1 1 时,结果会在二进制表示中翻转所有比最高位 1 1 1 低的位。例如:

  • 2 3 = 8 2^3 = 8 23=8 二进制表示为 1000 1000 1000
  • 2 3 − 1 = 7 2^3 - 1 = 7 231=7 二进制表示为 0111 0111 0111

  对于 2 2 2 的幂,其二进制表示中只有一个 1 1 1,减去 1 1 1 之后,这个 1 1 1 变成 0 0 0,而它右边所有的 0 0 0 都变成 1 1 1。因此, 2 2 2 的幂与它减 1 1 1 的结果的按位与操作结果为 0 0 0,因为没有一个位同时是 1 1 1


下面是对 !(n & (n - 1)) 的详细解释:

  • n & (n - 1):这是对 n n n n − 1 n-1 n1 进行按位与操作。如果 n n n 2 2 2 的幂,那么这个操作的结果应该是 0 0 0
  • !(n & (n - 1)):对上述结果取反,如果 n n n 2 2 2 的幂,那么结果将是true

  同时,还有一个前提条件是 n > 0 n > 0 n>0,因为 0 0 0 和负数不是 2 2 2 的幂。


这里有一个简单的例子来说明:

  • 假设 n = 4 n = 4 n=4(100 二进制)
  • n − 1 = 3 n - 1 = 3 n1=3(011 二进制)
  • n n n & ( n − 1 ) = 100 (n - 1) = 100 (n1)=100 & 011 = 000 011 = 000 011=000
  • ! ( 000 ) = !(000) = !(000)= true

  所以, 4 4 4 2 2 2 的幂。


  而如果 n n n 不是 2 2 2 的幂,比如 n = 6 n = 6 n=6 110 110 110 二进制):

  • n − 1 = 5 n - 1 = 5 n1=5 101 101 101 二进制)
  • KaTeX parse error: Expected 'EOF', got '&' at position 3: n &̲ (n - 1) = 110 & 101 = 100 101 = 100 101=100
  • ! ( 100 ) = !(100) = !(100)= false

因此, 6 6 6 不是 2 2 2 的幂。


后记:

🌟 感谢您耐心阅读这篇关于 巧用位运算 的技术博客。 📚

🎯 如果您觉得这篇博客对您有所帮助,请不要吝啬您的点赞和评论 📢

🌟您的支持是我继续创作的动力。同时,别忘了收藏本篇博客,以便日后随时查阅。🚀

🚗 让我们一起期待更多的技术分享,共同探索移动机器人的无限可能!💡

🎭感谢您的支持与关注,让我们一起在知识的海洋中砥砺前行 🚀

  • 14
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清流君

感恩有您,共创未来,愿美好常伴

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值