在java语言中使用二进制表示整数
问题是: 给你2个32位数字,N&M和2位位置,i&j。编写一种方法,将N中i和j之间的所有位设置为M(例如,M在i处变成N的子串) 从j开始) 例如: 输入: int N=1000000000,M=10101,i=2,j=6; 输出: int N=10001010100 我的解决方案:在java语言中使用二进制表示整数,java,implementation,bit-manipulation,Java,Implementation,Bit Manipulation,问题是: 给你2个32位数字,N&M和2位位置,i&j。编写一种方法,将N中i和j之间的所有位设置为M(例如,M在i处变成N的子串) 从j开始) 例如: 输入: int N=1000000000,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
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)
步骤1:组成一个掩码,以清除N中从i到j的集合
掩码=((((1位运算符
,&
,^
和~
以及十六进制文本(0x1010
)在java中都可用。)
32位数字是int
s,如果该约束保持不变int
将是有效的数据类型
顺便说一句
掩码=(-1>(32-i));
是一个稍微清晰的掩码结构位运算符|,&
,^
和~
以及十六进制文本(0x1010
)都可以在java中使用
32位数字是int
s,如果该约束保持不变int
将是有效的数据类型
顺便说一句
掩码=(-1>(32-i));
是一个稍微清晰的掩码结构,Java的int
包含了您需要的所有操作。我没有完全理解您的问题(现在太累了),所以我不会给您一个完整的答案,只是一些提示。(如果需要,我会在以后修改。)
- 下面是连续的
j
:(1Java的int
包含了您需要的所有操作。我没有完全理解您的问题(现在太累了),所以我不会给您完整的答案,只是一些提示。(如果需要,我会在以后修改。)
- 下面是一行中的
j
:(1我认为您误解了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;
}
publicstaticintapplybits(intn,intm,inti,intj){
M=MI
对于(int-loopVar=i;loopVar int-bitToApply=1我认为您误解了Java的工作原理。所有值都表示为“一系列位”,int和long都包含在其中
根据您的问题,大致的解决方案是:
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;
}
publicstaticintapplybits(intn,intm,inti,intj){
M=MI
对于(int-loopVar=i;loopVar int bitToApply=1“如果我们使用int…但没有二进制表示法”是什么意思?您完全可以将&
和|
应用于Java中的int。您是说用二进制编写int
文本吗?如果这是作业,请添加“作业”tag.Yes,我说的是用二进制定义一个int文本,它类似于C中的这个语句:int N=0x101010;Java中没有二进制文本。你有十进制、八进制和十六进制。但是你可以用基数为2的Integer.parseInt(String s,int-radix)
从字符串表示开始。你是什么意思“如果我们使用int…但没有二进制表示法?”您完全可以将&
和
应用于Java中的int。您是说用二进制编写int
文本吗?如果这是作业,请添加“作业”“tag.Yes,我说的是用二进制定义一个int文本,类似于C中的这个语句:int N=0x101010;Java中没有二进制文本。有十进制、八进制和十六进制。但是可以使用Integer.parseInt(字符串s,int基数)
从字符串表示开始,基数为2。在Java 7中,甚至还有一个二进制文本:0b1010
,在这里可能很方便。掩码非常好,除了:想要清除i和j之间的位,即j-i+1位。所以需要-1>>(32-i)在java 7中,甚至有一个二进制文字:<代码> 0B1010<代码>,它可能很方便。除了:要清除i和j之间的位,即J-i+1位。所以需要-1>(32-i)。在这个问题中,我们需要(J-I+1)位置在辛的中间这个问题,我们需要(J-I+1)位置在x的中间。
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;
}