[英]represent an integer using binary in java language
這是問題所在:
您將獲得2個32位數字N和M,以及兩個位置i和j。 編寫一種方法來將N中i和j之間的所有位設置為等於M(例如,在位於i處並從j開始時,M成為N的子串)
例如:輸入:int N = 10000000000,M = 10101,i = 2,j = 6; 輸出:int N = 10001010100
我的解決方案:
step 1: compose one mask to clear sets from i to j in N
mask= ( ( ( ((1<<(31-j))-1) << (j-i+1) ) + 1 ) << i ) - 1
for the example, we have
mask= 11...10000011
step 2:
(N & mask) | (M<<i)
問題:實現該算法的方便數據類型是什么? 例如,我們在C中具有int n = 0x100000,因此我們可以在n上應用按位運算符。 在Java中,我們有BitSet類,它具有清晰的set方法,但不支持左/右移位運算符; 如果我們使用int,則它支持左/右移位,但是沒有二進制表示(我不是在談論二進制字符串表示),實現此目的的最佳方法是什么?
Java中的代碼(閱讀所有注釋后):
int x = Integer.parseInt("10000000000",2);
int x = Integer.parseInt("10101",2);
int i = 2, j = 6;
public static int F(int x, int y, int i, int j){
int mask = (-1<<(j+1)) | (-1>>>(32-i));
return (mask & x ) | (y<<i);
}
按位運算符|
, &
, ^
和~
以及十六進制文字( 0x1010
)在Java中都可用
如果該約束保持不變,則int
32位數字int
將是有效的數據類型
順便說一句
mask = (-1<<j)|(-1>>>(32-i));
是面罩的結構稍微清晰一點
Java的int
具有您所需的所有操作。 我還不太了解您的問題(現在太累了),所以我不會給您完整的答案,只是一些提示。 (如果需要,我會在稍后進行修改。)
j
個: (1 << j)-1
。 j
個,后跟i
零: ((1 << j) - 1) << i
。 j
位置: x & ~(((1 << j) - 1) << i)
。 嘗試使用Integer.toBinaryString()
查看結果。 (對於負值或太大的值,它們也可能給出奇怪的結果。)
我認為您誤解了Java的工作原理。 所有值均表示為“一系列位”,其中包括整數和多頭。
根據您的問題,一個粗略的解決方案是:
public static int applyBits(int N, int M, int i, int j) {
M = M << i; // Will truncate left-most bits if too big
// Assuming j > i
for(int loopVar = i; loopVar < j; loopVar++) {
int bitToApply = 1 << loopVar;
// Set the bit in N to 0
N = N & ~bitToApply;
// Apply the bit if M has it set.
N = (M & bitToApply) | N;
}
return N;
}
我的假設是:
i
是N
中設置的最右邊(最低有效)位。 M
的最右邊的位從右邊映射到N
的第i
位。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.