2011-08-19 50 views
0

在这里表示使用二进制整数的问题是:在java语言

你给定的2个32位数字,N & M和2位的位置,我&Ĵ。写来设置于N等于M i和j之间的所有位的方法

例如(例如,M处我 定位和与j开始成为N的子串): 输入: INT N =百亿, 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类,它有明确的设置方法,但不支持 左/右移运算符;如果我们使用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); 
}   
+0

你是什么意思_“如果我们使用int ...但没有二进制表示法?”_您可以绝对地将'&'和'|'应用于Java中的ints。你是说在二进制文件中编写一个'int'文字吗? –

+0

如果这是作业,请添加“家庭作业”标签。 –

+0

是的,我说的是在二进制中定义一个int字面值,它类似于C语言中的这个语句:int N = 0x101010; – SecureFish

回答

3

的位运算符|&^~和十六进制文字(0x1010)都在Java中可用

32位数是int s如果仍有约束int将是有效的数据类型

顺便说一句

mask = (-1<<j)|(-1>>>(32-i)); 

是面具

+1

在Java 7中甚至有一个二进制文字:' 0b1010',这可能来得方便。 –

+0

这个掩码是非常好的,除了:想清除我和j之间的比特,这是j-i + 1比特。所以需要-1 <<(j + 1)| -1 >>>(32-i) – SecureFish

0

Java的int有你需要的所有操作的稍微清晰的结构。我并没有完全理解你的问题(现在太累了),所以我不会给你一个完整的答案,只是一些提示。 (如果需要,我会稍后修改它。)

  • 这里是j连续几行:(1 << j)-1
  • 这里是j个连续,然后是i零:((1 << j) - 1) << i
  • 这里是一个掩码,掩盖了位于x:x & ~(((1 << j) - 1) << i)中间的j位置。

尝试用Integer.toBinaryString()查看结果。 (他们也可能会给出负值或太大值的奇怪结果。)

+0

在这个问题中,我们需要(j-i + 1)个位置在x的中间 – SecureFish

0

我认为你误解了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的最右侧位映射到Ni位右起。
  • 过早优化是所有邪恶的根源 - 这是O(j-i)。如果你在问题中使用了一个复杂的面具,你可以在O(1)中做到这一点,但它不会像可读的那样,并且可读代码的97%比有效代码更重要。