两个32位数字给出M和N.给出i和j两个位的位置。该方法应该将N和j之间的所有位设置为N等于M.
N =千万 M = 1111 i = 3且j = 7 输出:N = 10111100
int modifybits(int i,int j,int N,int M)
{
int max=1;
//the string from the left of i and right of j should remain the same and the rest should become 0
int left= N>>31-i
left=left<<31
int right =N<<j
right=right>>31-j
int new_N=left|right
int result=new_N|M
print(result)
}
你能提供更好的解决方案吗,这似乎不起作用!! Thnx in adv
答案 0 :(得分:3)
int modifybits(int i, int j, int N, int M) {
int mask = ~0; // mask with only 1
int res = 0;
// Note: We need the -1 here because you started numbering bits at
// the last position with 1 not with 0 as usual
mask = mask >> (i - 1);
mask = mask << (i - 1 + 32 - j - 1);
mask = mask >> (32 - j - 1); // now mask should contain only 1 at the positions
// we want to change in N
M = M & mask; // M is now only set at the masked bits
N = N & (~mask); //we set all within mask to zero
N = N | M;
return N;
}
另一个注意事项:我假设32位是你系统中的整数!否则你应该在掩码的计算中替换32
答案 1 :(得分:2)
您的问题并非100%明确。 “该方法应将i和j之间的所有位设置为N等于M” - 但M通常比(j-i)有更多的位,你想使用相同的位置或位置0 ..(j-i)?另外,在您的示例中,您使用索引1作为lsb(最右边的位)?
您可以使用位域执行此操作。在您的示例中,您要替换位2-6(?),因此请使用位域B = 01111100。
如果要将N [2-6]设置为M [2-6],请使用N =(N&amp; ~B)| (M&amp; B)。
如果要将N [2-6]设置为M [0-4],请使用N =(N&amp; ~B)| ((M <&lt; 2)&amp; B)。