leetcode342合理运用位操作判断4的幂

Given an integer (signed 32 bits), write a function to check whether it is a power of 4.

Example:
Given num = 16, return true. Given num = 5, return false.

Follow up: Could you solve it without loops/recursion?

我的解法极其垃圾,建议不要看。

public class Solution {
    public boolean isPowerOfFour(int num) {
        if(num == 0 || (num != 1 && num % 4 != 0))
            return false;
        else if(num == 1 || num == 4)
            return true;
        else
            return isPowerOfFour(num/4);
    }
}

解释一下高手的解法。

public boolean isPowerOfFour(int num) {
        return num > 0 && (num&(num-1)) == 0 && (num & 0x55555555) != 0;
        //0x55555555 is to get rid of those power of 2 but not power of 4
        //so that the single 1 bit always appears at the odd position
    }

要满足一个数是四的n阶指数如16,64这种,上面给出的解法意思就是要满足三个条件。

1、大于零

2、比它小1的数相与为0,简单的说,这个数的二进制表示的时候只能有一个1,其他的均为0

3、这个唯一的1必须正确的位置上面,

0x55555555 十六进制数,是01010101010101010101010101010101
和这个数相与如果结果不为那么1就在01010101010101010101010101010101的1的位置上面,只有一个1且还在这些位置上面的数都是满足条件的。
时间: 2024-10-15 20:06:18

leetcode342合理运用位操作判断4的幂的相关文章

POJ3641 Pseudoprime numbers(快速幂+素数判断)

POJ3641 Pseudoprime numbers p是Pseudoprime numbers的条件: p是合数,(p^a)%p=a;所以首先要进行素数判断,再快速幂. 此题是大白P122 Carmichael Number 的简化版 /* * Created: 2016年03月30日 22时32分15秒 星期三 * Author: Akrusher * */ #include <cstdio> #include <cstdlib> #include <cstring&g

[LeetCode]Reverse Bits

题目:Reverse Integer Reverse digits of an integer. Example1: x = 123, return 321Example2: x = -123, return -321 Have you thought about this? Here are some good questions to ask before coding. Bonus points for you if you have already thought through thi

Pseudoprime numbers poj3641

Pseudoprime numbers Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8682   Accepted: 3645 Description Fermat's theorem states that for any prime number p and for any integer a > 1, ap = a (mod p). That is, if we raise a to the pth power

cJSON源码分析

cJSON源码分析 简介 由于C语言汇总,没有直接的字典,字符串数组等数据结构,所以要借助结构体定义,处理json. JSON是一种轻量级的数据交换格式.JSON采用完全独立与语言的文本格式,易于人阅读和编写.同时也易于机器解析和生成.它是基于JavaScript,Programming Language,Standard ECMA-262 3rd Edition -December 1999的一个子集.JSON采用完全独立于语言的文本格式,但是也使用了类似于C语言家族的习惯(如C,C++,C+

计算n阶乘中尾部零的个数

写在前面 本来觉得问题挺容易的,不打算记录,谁知道一不小心,还真没做出来.最终凭借"朴实"的算法思想解决了问题,但是其中的曲折还真是汗颜.科学的思维指导确实必不可少,"野路子"的朴素的战斗理论不论是效率还是后续的算法演进都经不起考验. 这里只是记录一下自己最近两天对此问题的一些想法,目前只能说是解决了问题,并且满足题目要求.据说问题来自<编程之美>,以后刷书本的时候看到原题,如果需要补充的话,再来更新. And,开始吧~ 正文 题目 设计一个算法,计算出

CJSON源码研究笔记

断断续续的CJSON源码看了也有一段时间了,研究一番还是收获颇多!很适合有一点C基础的想继续提高练手的开源源码!cJson.c代码只有700多行,官网上下的,代码风格个人感觉不是很方便阅读,如果全部展开的话代码估计至少不在1100行之下.网上也看了一些前辈们的cjson笔记!对于像我这这样初次接触CJSON还是相当有帮助的!下面就来一点一点的分析源码!这里记录一下自己对源码研究理解的笔记!同时也希望对别人作为参考也有一点点的帮助! 研究源码之前首先还是搞清楚CJSON到底是干啥的!这样可以对整个

Carmichael Numbers(Uva 10006)

  Carmichael Numbers An important topic nowadays in computer science is cryptography. Some people even think that cryptography is the only important field in computer science, and that life would not matter at all without cryptography. Alvaro is one

[LeetCode]231. Power of Two判断是不是2的幂

/* 用位操作,乘2相当于左移1位,所以2的幂只有最高位是1 所以问题就是判断你是不是只有最高位是1,怎判断呢 这些数-1后形成的数,除了最高位,后边都是1,如果n&n-1就可以判断了 如果是2的幂,&的结果是全0 */ if (n<=0) return false; return ((n&(n-1))==0); 划重点: 一个数*2,出相当于左移一位 原文地址:https://www.cnblogs.com/stAr-1/p/8478279.html

快速判断一个数是否是4的幂次方,若是,并判断出来是多少次方!

将4的幂次方写成2进制形式后,很容易发现有个特点,2进制中只有1个1(1在奇数位置),并且后面跟了偶数个0:因此问题可以转化为判断1后面是否跟了偶数个0就可以了. 4的整数次幂的二进制可以写为2^(2*n),即也可以写成2的幂次方,当然就满足2的幂次方的条件,即num&(num-1)==0. 思路:首先用条件num&(num-1)==0来判断是否为2的幂次方,若不满足,则不是.若满足,再用条件num&0x5555 5555 来判断,若为真,则这个整数是4 的幂次方.否则不是. #i