如何判斷一個數是否為2的冪次方
最近在OJ上做題,遇到一道題,其中一個細節就是需要判斷一個數是否為2的冪次方。初看似乎很簡單,可我想來想去,竟然無甚好辦法。最後我用一個笨辦法解決了,那就是將2 4 8 16 32… …存到一個數組裡,遍歷一遍陣列就知道了。但是這個辦法著實不優美。
下面介紹一個好辦法
- (n & n - 1) == 0
將2的冪次方寫成二進位制形式後,很容易就會發現有一個特點:二進位制中只有一個1,並且1後面跟了n個0。如果將這個數減去1後會發現,僅有的那個1會變為0,而原來的那n個0會變為1;因此將原來的數與減去1後的數字進行與運算
後會發現為零。
- & 按位與運算子:兩位同時為1,結果才為1,否則為0
- | 按位或運算子:兩位中有一個為1,結果就為1
- ^ 異或運算子:兩位值不同,結果為1,否則為0
- ~ 取反運算子:將0變1,1變0,就是反著來
- << 左移運算子:各二進位制位全部左移若干位,左邊丟棄,右邊補0
- >> 右移運算子:各二進位制位全部右移若干位,正數左補0,負數左補1,右邊丟棄
- 兩個不同長度的資料進行位運算時,系統會將二者按右端對齊,然後進行位運算。短的那個資料如果是負數,左邊補1,否則補0
相關推薦
如何判斷一個數是否為2的冪次方
最近在OJ上做題,遇到一道題,其中一個細節就是需要判斷一個數是否為2的冪次方。初看似乎很簡單,可我想來想去,竟然無甚好辦法。最後我用一個笨辦法解決了,那就是將2 4 8 16 32… …存到一個數組裡,遍歷一遍陣列就知道了。但是這個辦法著實不優美。 下面介紹一個好辦法
判斷一個數是否為2的N次方
在閱讀goim原始碼的時候, 在ring.go中看到這句程式碼: // 2^N if num&(num-1) != 0 { // ... } 原來這是判斷2的N次方。 然後總結了下, 判斷一個數n是否為2的N次方的辦法(要求n>0): 第一種:笨辦法
c語言==判斷一個數是否為2的整數次方【不使用迴圈】
對於判斷一個數是否為2的N次方問題,通常想到的最為直接的辦法就是對這個數不斷對2取餘,為0就將該數變為該數除以2,直到最後該數為1為止。 void judge(int n) { while(!(n % 2)) { n = n
【C語言】判斷一個數是否為2的n次方
//判斷一個數是否為2的n次方 #include <stdio.h> int is_two_n(int num) { if ((num&(num - 1))) //去掉一個1
劍指offer——面試題15.1:判斷一個數是否為2的整數次方
lose while ios play 技術 using pow ret offer 1 #include"iostream" 2 using namespace std; 3 4 bool IsTwoPower(int n) 5 { 6 retu
面試:快速判斷一個數是否是2的冪次方,若是,並判斷出來是多少次方!
/********************************************************************** 將2的冪次方寫成二進位制形式後,很容易就會發現有一個特點: 二進位制中只有一個1,並且1後面跟了n個0; 因此問題可以轉化為判斷1後
【C語言】推斷一個數是否為2的n次方
post data- popu scanf scan ng- 輸入 ont print //推斷一個數是否為2的n次方 #include <stdio.h> int is_two_n(int num) { if ((num&(num - 1))
關於如何判斷一個數是否是2的整數次方的問題
有這樣的一道題: 有一串奇怪數列如下:1 2 -3 4 -5 -6 -7 8 -9 ... 即從1-n,碰到2的次方倍則顯正,其他則是負數。(2的整次方包括:1,2,4,8,16,32,64,128,....) 現在給你一個n,求出,這個數列的和。 直接來判斷一個數是
python判斷一個數是否是2的幾次冪
判斷一個數是不是2的幾次冪,最簡單粗暴的做法就是直接迭代除以2,這裡有一個更好的方法,那就是採用位運算。 我們觀察下面屬於2的幾次冪的數的變化規律,用2進製表示。 十進位制 二進位制 0 0 2 10 4
判斷一個數是否是2的整數次冪,python實現。
問題:判斷一個數是否是2的整數次冪? 分析一:判斷一個數是否是是2的整數次冪。方法和思路也很多,其中最簡單的就是,用這個數除以2用除的商再除以2,直到最後被除數為2,證明這個數是2的整數次冪。這種思路
java 判斷一個數是否是2的整數次冪
有一道演算法題是這樣的,求一個數是否是2的整數次冪。 剛開始我的演算法是這樣寫的: 讓這個數每次都除以2,然後再乘以2,看這兩個數是否相等,不相等就返回false。放在迴圈裡面讓它從頭除到尾。 publicboolean isPower(int number){
C:冒泡排序&判斷一個數是否為素數&求平方根的叠代公式
mat stdio.h ret 找不到 nbsp emp prim 冒泡排序 公式 冒泡排序 #include<stdio.h> int main () { int i,j,n,temp,a[10]; scanf("%d",&n);
判斷一個數是否為回數
判斷 n) back for format %s 個數 一個 lse 回數:數字正反都是它本身就叫回數 def is_back_num(num): if str(num) == str(n)[::-1]
C語言之判斷一個數是否為素數
#include "stdio.h" #include"time.h" #include"math.h" int isPrimeNumber(int number) { //判斷是否為素數 float sqrtOfNum = sqrt((double) number); for
Python之判斷一個數是否為素數
import math def is_prime(number): # 判斷是否為素數 sqrt = int(math.sqrt(number)) for j in range(2, sqrt + 1): # 從2到number的算術平方根迭代 if in
C++之判斷一個數是否為素數
#include <iostream> #include "math.h" using namespace std; bool isPrimeNumber(int number) { //判斷是否為素數 float sqrtOfNum = sqrt(number);
Java之判斷一個數是否為素數
public class PrimeNumberTest { public static void main(String[] args) { long start = System.currentTimeMillis(); System.out.prin
判斷一個數是否為素數(質數)-- 程式碼優化
【概念】 質數又稱素數。一個大於1的自然數,除了1和它自身外,不能整除其他自然數的數叫做質數;否則稱為合數。 這裡以Python程式碼為例,最簡單的一種想法,按照概念: def is_prime(num
判斷一個數是否為水仙花數
原部落格地址 在判斷某一個數是水仙花數之前,我們先介紹一下什麼是水仙花數。 水仙花數(Narcissistic number)也被稱為超完全數字不變數(pluperfect digital invariant,PPDI)、自戀數、自冪數、阿姆斯壯數或阿姆斯特朗
判斷一個數是否為完美數核心程式碼
package 演算法學習;import java.util.*;//整除找因子必然用到模運算public class 完美數 {public boolean isPerfect(int n) {int sum=0;for(int i=1;i<n;i++) {if(n%