[解決済み] 32ビット数値のバイトを置き換える
2022-02-17 17:14:31
質問
という関数があります。
replaceByte(x,n,c)
これは、バイト
n
で
x
と
c
を、以下の制限付きで使用することができます。
- 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;
}
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー:cの入力の最後に期待される宣言またはステートメント
-
[解決済み】「ポインタから異なるサイズの整数へのキャスト」エラーが発生するのはなぜですか?
-
[解決済み] Connect: ソケット以外でのソケット操作
-
[解決済み】メモリー・クロバリング・エラー
-
[解決済み】C言語で多重定義を防ぐには?
-
[解決済み】fgetsによるセグメンテーションフォールト(コアダンプ) - と思う。
-
[解決済み】C言語でint64_t型を表示する方法
-
[解決済み】malloc():メモリ破壊
-
[解決済み】MPI通信でMPI_Bcastを使用する場合
-
[解決済み】C言語でpow( )への未定義参照、math.hを含むにもかかわらず【重複】。