Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 位操作修改位以包括数字_Java_Bit Manipulation_Bit_Bit Shift - Fatal编程技术网

Java 位操作修改位以包括数字

Java 位操作修改位以包括数字,java,bit-manipulation,bit,bit-shift,Java,Bit Manipulation,Bit,Bit Shift,我正在准备面试,几个小时来我一直在努力理解这个问题: 给你两个32位的数字N和M,还有两个位的位置i 和j。编写一种方法,将N中i和j之间的所有位设置为M (例如,M成为位于i且从j开始的N的子串) 有人能给出一个完整的例子,并详细说明实际需要什么吗?我需要设置i和j之间的值来形成M的值,还是实际设置M中的位 是否有一些关于bits操作的好教程来解释这些概念 谢谢大家! 假设这2个32位数字是:- M = "00010101010101010101010101010101"; N = "1010

我正在准备面试,几个小时来我一直在努力理解这个问题:

给你两个32位的数字N和M,还有两个位的位置i 和j。编写一种方法,将N中i和j之间的所有位设置为M (例如,M成为位于i且从j开始的N的子串)

有人能给出一个完整的例子,并详细说明实际需要什么吗?我需要设置i和j之间的值来形成M的值,还是实际设置M中的位

是否有一些关于bits操作的好教程来解释这些概念


谢谢大家!

假设这2个32位数字是:-

M = "00010101010101010101010101010101";
N = "10101010100001010101100101011111";
i = 13;
j = 23;
他们只是想让N的第13到23位与M的相同

我从右手边数位置

                                             23rd bit  13th bit
所以,这里,M是第13到23个字符=“00001010\uuuuuuuuuuuu10101001\uuuuuuuuuuu101010101”

因此,N必须是101010101___10101010101____100101011111

N=101010101“10101010101”100101011111

可以使用“”

  • 使用逐位或递增方式为位置i到j创建掩码,并将每个位设置为1
  • 使用掩码的按位和按位NOT清空N中的位
  • 使用带按位AND的掩码从M中选择位
  • 使用按位或按位复制中的位
我知道我在示例中使用了十六进制,但同样的原则也适用,只是更容易阅读

范例

int n = 0x12345678;
int m = 0x55555555;

int i = 4; // assume right to left
int j = 15;

int mask = 0;
for (int pos = i; pos <= j; pos++) {
    mask = mask | (1 << pos);
}
System.out.println(String.format("mask is     0x%08x", mask));

int nCleared = n & ~mask;
System.out.println(String.format("clear n     0x%08x", nCleared));

int bitsFromM = (m & mask);
System.out.println(String.format("Bits from m 0x%08x", bitsFromM));

int nWithM = bitsFromM | nCleared;
System.out.println(String.format("n with m    0x%08x", nWithM));

这是一个措辞糟糕得令人惊讶的问题。对不起,我还是Stackoverflow的初学者!我不是指你的问题——我是指给你的问题。你的比他们的好得多!我的回答涵盖了你想知道的一切吗?是的,非常感谢!
int n = 0x12345678;
int m = 0x55555555;

int i = 4; // assume right to left
int j = 15;

int mask = 0;
for (int pos = i; pos <= j; pos++) {
    mask = mask | (1 << pos);
}
System.out.println(String.format("mask is     0x%08x", mask));

int nCleared = n & ~mask;
System.out.println(String.format("clear n     0x%08x", nCleared));

int bitsFromM = (m & mask);
System.out.println(String.format("Bits from m 0x%08x", bitsFromM));

int nWithM = bitsFromM | nCleared;
System.out.println(String.format("n with m    0x%08x", nWithM));
mask is     0x0000fff0
clear n     0x12340008
Bits from m 0x00005550
n with m    0x12345558