2015-10-15 63 views
0

我正在为该问题调试一些解决方案,这里是问题的详细信息,我的具体问题是,我认为第14行是错误的,因为我们没有找到M的子部分(我是指第i个和第j个之间的比特),但是使用整个M,是正确的?取代第i和第j在第N和M之间的比特到M

给出两个32位数字N和M以及两个位位置i和j。编写一个方法来设置N和M之间的所有位(例如,M变成位于i并且从j开始的N的子串)。 实施例: 输入:N =百亿,M = 10101,I = 2,J = 6 输出:N = 10001010100

public static int updateBits(int n, int m, int i, int j) { 
    int max = ~0; /* All 1’s */ 

    // 1’s through position j, then 0’s 
    int left = max - ((1 << j) - 1); 

    // 1’s after position i 
    int right = ((1 << i) - 1); 

    // 1’s, with 0s between i and j 
    int mask = left | right; 

    // Clear i through j, then put m in there 
    return (n & mask) | (m << i); // Line 14. 
} 

由于事先 林

+1

我再次问:请不要在您的代码中放入行号,特别是如果您不打算缩进它适当地或引用您的问题中的任何代码行。 –

+1

@AndyTurner,谢谢,我下次肯定会照顾的。 :P –

+1

所以最新你的问题?如果它检查逻辑或者不用打印语句运行你最喜欢的IDE。或者您是我们向您解释这种方法的问题吗? –

回答

1

此问题的作者应增加了以下内容。

M的长度将总是等于ij之间的包容性距离。例如位置i = 2和j = 6这意味着5个空间 被占用;所以M的长度将是5.这意味着N中的5位将被M代替。

或者认为它是这样的。我和j只适用于N中的每个元素,我和j之间的N将被替换为M.

+0

感谢MarquisBlount,如果M不是5位(我的意思是32位整数,它没有27个标题零前缀),我发布的原始逻辑是错误的,对吗? –

+1

是的,你是正确的,如果M没有全部领先0除了最后5位,那么这种逻辑将不会正确行事。这个问题来自破解编码面试书。我认为这个问题可以更好地解释。 –

+0

感谢MarquisBlount,这正是我感到困惑的,谢谢你的回答,并将你的答案标记为已回答。祝你有美好的一天。 –

相关问题