位操作:修改32位整数以包含子串

时间:2011-03-31 09:42:56

标签: c bit-manipulation

两个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

2 个答案:

答案 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)。