簡體   English   中英

有沒有一種簡單的方法來獲得兩個數字的冪?

[英]Is there an easy way to get which power of two a number is?

如果我有一個數字,我確定它是 2 的冪,有沒有辦法得到這個數字是 2 的冪? 我想到了這個想法:計數並將數字右移 1 並增加計數直到數字為 0。但是還有其他方法嗎? 沒有櫃台?

編輯:這里有一些例子: 8 -> 返回 3 16 -> 返回 4 32 -> 返回 5

最優雅的方法是 De Bruijn 序列。 這是我對如何使用它們解決問題的類似問題給出的先前答案:

位旋轉:設置了哪個位?

一種通常更實用的方法是使用 CPU 的內置指令來查找第一個/最后一個位集。

如果該數字稱為x ,您可以通過計算log2f(x)找到它。 返回值是一個浮點數。

您需要包含<math.h>才能使用log2f

這種方法肯定會奏效。 另一種可能的方法是每次都消除一半的可能性。 假設您有一個 8 位數字:00010000

按位和您的數字,其中一半位為 1,另一半為 0,例如 00001111。

00010000 & 00001111 = 00000000

現在你知道它不在前四位。 重復這樣做,直到你沒有得到 0:

00010000 & 00110000 = 00010000

而不是將其縮小到一個可能的位,即 1,這是您的 2 的冪。

您可以在 cmath 中使用日志 function ...

double exponent = log(number)/log(2.0);

...然后將其轉換為 int 。

使用二分搜索而不是線性搜索:

public void binarySearch() throws Exception {
  int num = 0x40000;

  int k = 0;
  int shift = 16; // half of the size of the type (for in 16, etc)
  int a = 0xffff; // lower half should be f's

  while (shift != 0) {
    if ((num & a) == 0) {
      num = num >>> shift;
      k += shift;
      shift >>= 1;
    } else {
      shift >>= 1;
    }
    a = a >>> shift;
  }
  System.out.println(k);
}

如果您像我一樣執行for循環,一種方法是在比較之前為循環計數器供電:

for (var i = 1; Math.pow(2, i) <= 1048576; i++) {
  // iterates every power of two until 2^20
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM