我有一个称为replaceByte(x,n,c)的函数,该函数将n中的字节x替换为c,但有以下限制:

  • 从0(LSB)到3(MSB)的字节数
  • 示例:replaceByte(0x12345678,1,0xab) = 0x1234ab78
  • 您可以假设0
  • 法律行动:! ~ & ^ | + << >>
  • Max操作数:10
    int replaceByte(int x, int n, int c) {
            int shift = (c << (8 * n));
            int mask = 0xff << shift;
            return (mask & x) | shift;
        }
    

  • 但是当我测试它时,我得到这个错误:

    错误:测试replaceByte(-2147483648 [0x80000000],0 [0x0],0 [0x0])失败...
    ...给出0 [0x0]。应为-2147483648 [0x80000000]

    意识到*不是合法运算符后,我终于弄清楚了...如果您好奇的话,这就是我所做的:
    int replaceByte(int x, int n, int c) {
      int mask = 0xff << (n << 3);
      int shift = (c << (n << 3));
      return (~mask & x) | shift;
    }
    

    最佳答案

    啊...你快到了。

    只是改变

    return (mask & x) | shift;
    


    return (~mask & x) | shift;
    
    mask应该包含所有字符,除了要屏蔽的区域,反之亦然。

    我正在使用这个简单的代码,它在gcc中可以正常工作
    #include<stdio.h>
    
    int replaceByte(int x, int n, int c)
    {
        int shift = (c << (8 * n));
        int mask = 0xff << shift;
        return (~mask & x) | shift;
    }
    
    int main ()
    {
    
        printf("%X",replaceByte(0x80000000,0,0));
    
        return 0;
    }
    

    10-04 14:40