【发布时间】:2011-08-19 00:25:02
【问题描述】:
问题来了:
给定 2 个 32 位数字,N 和 M,以及两个位位置,i 和 j。编写一个方法来设置 N 中 i 和 j 之间的所有位等于 M(例如,M 在位于 i 处成为 N 的子串 从 j) 开始
例如: 输入: 整数 N = 10000000000,M = 10101,i = 2,j = 6; 输出: 整数 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中的代码(读完所有cmets后):
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);
}
【问题讨论】:
-
你是什么意思 "如果我们使用 int... 但没有二进制表示?" 您绝对可以将
&和|应用于 Java 中的 int。你是说用二进制写一个int文字吗? -
如果这是作业,请添加“作业”标签。
-
是的,我说的是在二进制中定义一个 int 字面量,它类似于 C 中的这个语句: int N = 0x101010;
-
Java 中没有二进制文字。你有十进制,八进制和十六进制。但是您可以使用基数为 2 的
Integer.parseInt(String s, int radix)从字符串表示开始。 download.oracle.com/javase/6/docs/api/java/lang/…
标签: java implementation bit-manipulation