我的采访学习,我一直在试图理解现在这个问题了几个小时:位操作修改位,包括数
现在给你两个32位的数字,N和M,以及两个比特位置,我 和j。写一种方法来设置N和M之间的所有位,其中N等于M (例如,M变成位于i并且从j开始的N的子串)。
有人能给出一个完整的例子,并通过实际需要?我是否需要在i和j之间设置M的值,或者实际上M中的位?
是否有一些关于位操作的良好教程来解释这些概念?
谢谢!
我的采访学习,我一直在试图理解现在这个问题了几个小时:位操作修改位,包括数
现在给你两个32位的数字,N和M,以及两个比特位置,我 和j。写一种方法来设置N和M之间的所有位,其中N等于M (例如,M变成位于i并且从j开始的N的子串)。
有人能给出一个完整的例子,并通过实际需要?我是否需要在i和j之间设置M的值,或者实际上M中的位?
是否有一些关于位操作的良好教程来解释这些概念?
谢谢!
可使用“masking”
我知道我在我的例子中使用了十六进制,但同样的原则适用,只是更容易阅读。
例
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
比方说,那些2个32位数字是: -
M = "00010101010101010101010101010101";
N = "10101010100001010101100101011111";
i = 13;
j = 23;
他们只是希望你从N的第13位到第23位同那些在M.
我从计数的位置右侧。
23rd bit 13th bit
所以,在这里,男的第13到第23位字符= “000101010_____ 10101010101 ___010101010101”;
is the mid-spaced 10101010101.
因此,N必须是101010101___ 10101010101 _____100101011111
或N = 101010101 "10101010101" 100101011111
。
这是一个令人惊讶的严重问题措辞。 – 2014-12-06 13:01:17
对不起,我仍然是一个初学者与Stackoverflow! – SummerCode 2014-12-06 13:03:49
我不是说你的问题 - 我的意思是你给的问题。你的比他们的要好得多! – 2014-12-06 13:05:57