给你一个整数n请你判断该整数是否是2的幂次方。如果是返回true否则返回false。如果存在一个整数x使得n 2x则认为n是2的幂次方。示例 1输入n 1输出true解释20 1示例 2输入n 16输出true解释24 16示例 3输入n 3输出false提示-231 n 231 - 1进阶你能够不使用循环/递归解决此问题吗AC:classSolution{public:boolisPowerOfTwo(intn){if(n0)returnfalse;// 2 的幂的二进制表示中只有一个 1// 所以 n (n - 1) 应该等于 0return(n(n-1))0;}};这是道很典型2的幂判断题型至于为何能够判断解释如下2 的幂的二进制表示里只有一个 11 - 00012 - 00104 - 01008 - 1000发生了什么n - 1会把n最高位的那个1变成0并把该位右边的所有低位0变成1例如n8(1000)n -17(0111)n(n -1)100001110000对于任意只有一个1的数n和n-1在那个位置上一定互斥所以 按位与为0。为什么不是其它数?如果n不是2的幂例如n 6:6 01105 01016 5 0100不是 0∵6有两个1n-1只会清掉最右边的1剩下的高位1仍然在结果中。∴ 这个表达式的逻辑n 0n 只有一个 1 位n (n - 1) 结果就是 0因此(n (n - 1)) 0能返回true表示n是2的幂。附上官方题解
【Leetcode】231. 2的幂
给你一个整数n请你判断该整数是否是2的幂次方。如果是返回true否则返回false。如果存在一个整数x使得n 2x则认为n是2的幂次方。示例 1输入n 1输出true解释20 1示例 2输入n 16输出true解释24 16示例 3输入n 3输出false提示-231 n 231 - 1进阶你能够不使用循环/递归解决此问题吗AC:classSolution{public:boolisPowerOfTwo(intn){if(n0)returnfalse;// 2 的幂的二进制表示中只有一个 1// 所以 n (n - 1) 应该等于 0return(n(n-1))0;}};这是道很典型2的幂判断题型至于为何能够判断解释如下2 的幂的二进制表示里只有一个 11 - 00012 - 00104 - 01008 - 1000发生了什么n - 1会把n最高位的那个1变成0并把该位右边的所有低位0变成1例如n8(1000)n -17(0111)n(n -1)100001110000对于任意只有一个1的数n和n-1在那个位置上一定互斥所以 按位与为0。为什么不是其它数?如果n不是2的幂例如n 6:6 01105 01016 5 0100不是 0∵6有两个1n-1只会清掉最右边的1剩下的高位1仍然在结果中。∴ 这个表达式的逻辑n 0n 只有一个 1 位n (n - 1) 结果就是 0因此(n (n - 1)) 0能返回true表示n是2的幂。附上官方题解