替换32位数字的字节

asd*_*jkl 8 c

我有一个调用的函数replaceByte(x,n,c)是替换字节nxc具有以下限制:

  • 编号从0(LSB)到3(MSB)的字节
  • 例子: replaceByte(0x12345678,1,0xab) = 0x1234ab78
  • 您可以假设0 <= n <= 3且0 <= c <= 255
  • 法律行动: ! ~ & ^ | + << >>
  • Max ops:10

    int replaceByte(int x, int n, int c) {
            int shift = (c << (8 * n));
            int mask = 0xff << shift;
            return (mask & x) | shift;
        }
    
    Run Code Online (Sandbox Code Playgroud)

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

错误:测试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;
}
Run Code Online (Sandbox Code Playgroud)

Pra*_*ian 7

由于这看起来像家庭作业,我不会发布代码,但列出了您需要执行的步骤:

  1. 铸造c成一个32位的号码,以便在换挡你不会失去任何位
  2. 接下来,c向左n==0移动适当的位数(如果没有移位,如果n==1移位8等)
  3. 创建一个32位的位掩码,将最低8位置零x,然后将此掩码移动与最后一步相同的量
  4. 执行移位的位掩码的按位AND x并将相应的位清零x
  5. 执行移位c值的按位OR(或加法)并x替换后者的屏蔽位


Pav*_*ath 5

啊...你快到了。

只是改变

return (mask & x) | shift; 
Run Code Online (Sandbox Code Playgroud)

return (~mask & x) | shift;
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

  • 嗯,即使那样,我也遇到同样的错误 (2认同)
  • 你能解释一下 -&gt; "int mask = 0xff &lt;&lt; shift;" 为你工作。对我来说似乎不正确。像 OP 更新可能应该是“int mask = 0xff &lt;&lt; (n &lt;&lt; 3);” (2认同)