簡體   English   中英

用Java語言中的二進制表示整數

[英]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
  • 這是一個位掩碼,它屏蔽了x中間的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;
}

我的假設是:

  • iN中設置的最右邊(最低有效)位。
  • M的最右邊的位從右邊映射到N的第i位。
  • 過早的優化是萬惡之源-這就是O(ji)。 如果像問題中那樣使用復雜的掩碼,則可以在O(1)中進行操作,但是它的可讀性不高,可讀代碼比有效代碼重要的時間是97%。

暫無
暫無

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

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