在java语言中使用二进制表示整数

在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

问题是:

给你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-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;loopVarint-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;loopVarint 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;
      }