Part Three 习题巧解 之 1. 判断奇偶数
Part Three 习题巧解 之 2. 两数交换
Part Three 习题巧解 之 3. 只出现一次的数字
Part Three 习题巧解 之 4. 位1的个数
Part Three 习题巧解 之 5. 2的幂
6. 4的幂
6.1 题目描述
6.2 思路讲解
思路讲解之前,请先思考一下除了一般做法的其他思路,尽量往位运算方面靠。
6.2.1 4的幂的特性
4的幂有什么特性呢?
研究一下上面的图示不难发现,一个数如果是4的幂,那么一定是2的幂,并且位为1的是偶数位(从0开始算)
所以问题转换为位1的个数为1并且位为1的是偶数位的情况。
注意:需要特判一下n<=0的情况,n<=0都不是4的幂
6.2.2 位运算
思路:先判断是否为2的幂,再判断位为1是否为偶数位
问题转换:从上一篇Part Three 习题巧解 之 5. 2的幂已经知道怎么求解2的幂,只需要在2的幂上判断位为1是否为偶数位,是则为4的幂,不是则不为4的幂
问题继续转换:判断位为1是否为偶数位,可以与0x55555555按位与,判断是否与原数相等,是则为4的幂,不是则不为4的幂。
原因:n&0x55555555是对偶数位进行保留,因为偶数位都是1,1&1=1、1&0=0都是对原有数位进行保留。而奇数位都是0,0&1=0、0&0=0都是对原有数位归为0。
问题也可转换:判断位为1是否为偶数位,可以与0xaaaaaaaa按位与,判断是否等于0,是则为4的幂,不是则不为4的幂。
原因:n&0xaaaaaaaa是对奇数位进行保留,因为奇数位都是1,1&1=1、1&0=0都是对原有数位进行保留。而偶数位都是0,0&1=0、0&0=0都是对原有数位归为0。
6.2.3 总结
思路:此题需要掌握2的幂的解题思路以及4的幂的特征方可解决此题
位运算符的技巧:
n&(n-1)消灭了最右边的位为1的数
n&0xaaaaaaaa是对奇数位进行保留
n&0x55555555是对偶数位进行保留
6.3 代码实现
6.3.1 C语言
6.3.2 Java
7. 写在最后
系列解题文章已经是最后一篇了,你是否觉得位运算有许多巧妙之处。希望看完这篇文档的你,能动手验证一下。纸上得来终觉浅,绝知此事要躬行。
8. 文档分享
如果您觉得这份关于4的幂的文档还不错,尝试点击分享这份文档给好友吧!
作者 @MythicalCreature
于2020 年 08月 20日发布