1. ホーム
  2. c

[解決済み] 32ビット数値のバイトを置き換える

2022-02-17 17:14:31

質問

という関数があります。 replaceByte(x,n,c) これは、バイト nxc を、以下の制限付きで使用することができます。

  • 0(LSB)から3(MSB)までのバイト番号
  • replaceByte(0x12345678,1,0xab) = 0x1234ab78
  • 0 <= n <= 3、0 <= c <= 255 とすることができます。
  • リーガル・オプ ! ~ & ^ | + << >>
  • 最大稼働数 10

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

が、テストするとこんなエラーが出ます。

ERROR: Test replaceByte(-2147483648[0x80000000],0[0x0],0[0x0]) failed.... ...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;
}