[英]Convert an int to hex in Java
我需要確定int n是否為2的冪,並且我的方法是將n轉換為十六進制數並檢查每個位(0或1)。 但是,我從未在Java中使用過十六進制數字,有人可以在這里幫助我嗎?
轉換為String以及使用正則表達式進行替換都非常昂貴。
檢查(正)2的冪的簡單方法是檢查設置的位數。
if (x > 0 && Long.bitCount(x) == 1)
雖然Long.bitCount
看起來很復雜,但JVM可以用一條機器代碼指令替換它。
測試2的冪的規范方法(在谷歌搜索如何測試2的冪時會遇到很多,並且可能在代碼中會遇到)
x != 0 && (x & x - 1) == 0
經常遇到帶有更多括號的情況(優先偏執狂?)
x != 0 && (x & (x - 1)) == 0
通常會跳過x != 0
檢查並確保零不能輸入,或者(通常)零在某種意義上“等於” 2的冪。
當然,您可以更改條件x > 0
,如果你不想考慮-2147483648二的冪,盡管在許多情況下,這將是(因為它是全等到2 31模2 32,這樣解釋的簽名是一個鍋,而且總的來說只有一點點設置,所以一直都是PoT)
那么x & x - 1
有什么用呢? 它取消設置最低位,但讓我們在PoT的背景下進行查看。
讓我們忽略x <2並說x的形式為a10 k (即,任意位串后跟一個1,后跟k個零),從中減去1得到a01 k,因為-1借用了所有尾隨的零直到達到最低的置位,不置位,然后借位死,高位不變。
如果對a10 k和a01 k進行按位AND,則得到a00 k,因為與自身進行與運算的對象本身又是自身( a
),並且在AND的尾部始終有一個0,因此全為零。
現在有兩種情況。 0)a = 0。 然后結果為零,我們知道我們以10 k形式的x開始,它是2的冪。 並且1)a!= 0,則結果也不為零,這是因為a
仍然出現a
x,並且x不是2的冪,因為x至少具有兩個設置位(我們明確查看的最低設置位) ,和至少一個在其他某處a
)。
那么實際上還有另外兩種情況,x = 0和x = 1被忽略了。 如果我們允許k為零,則x = 1也包括在內。 但是x = 0很煩人,在x & x - 1
中, x
是&
的左操作數,因此無論右操作數發生什么,結果都必須為零。 因此,它屬於特殊情況。
沒有理由轉換為十六進制來檢查位。 實際上,這實際上使它變得更加困難。 以下行為int變量“ num”生成二進制字符串:
String binary = Integer.toString(num, 2)
該字符串將只有1和0。 然后消除任何0:
String ones = binary.replace("0", "");
如果String的長度大於1,則存在一個以上的位,這表示它不是2的冪。如果長度為0,則表示該數字沒有位,即為0。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.