[解決済み] 2バイトの整数を入れ替える
2022-02-01 19:59:15
質問
int x, int n, int mの3つのパラメータを受け取るメソッドがあり、xのn番目とm番目のバイトを入れ替えたintを返します。
x は通常の整数で、任意の値を設定します。n と m は 0 から 3 までの整数です。
例えば、xの16進数表現を0x12345678とし、nを0、mを2とします。 最後と最後から3番目のバイトは入れ替わることになっている(n=78、m=34)。
xからn番目とm番目のバイトを取り出す方法はわかりましたが、4バイトすべてをメソッドが返すはずの整数に再結合する方法がわかりません。
以下は現在の私のコードです。 `
int byteSwap(int x, int n, int m)
{
// Initialize variables which will hold nth and mth byte
int xn = x;
int xm = x;
// If n is in bytes, n << 3 will be the number of bits in that byte
// For example, if n is 2 (as in 2 bytes), n << 3 will be 16 (as in 16 bits)
xn = x >> (n << 3);
// Mask off everything except the part we want
xn = xn & 0xFF;
// Do the same for m
xm = x >> (m << 3);
xm = xm & 0xFF;
}
`
さらにいくつかの制約があります - 以下のものだけが許可されます。
~ & ^ | ! + << >>
(つまり
- * /
, ループ。
if
sなど。ただし、追加の変数を初期化し、追加することは問題ありません)。
私のコードでは、n番目とm番目のバイトを抽出することはできますが、ifを使用せずにすべてを再結合する方法がわかりません。
どのように解決するのですか?
いくつかのこと
xをmバイトとnバイトを除くすべてのFFでマスクすることで再結合できます。 0xFFをm回、n回左シフトしてマスクを計算し、その結果を組み合わせて0xFFFFFFとXORすればよい。
int mask = 0;
int mask_m = 0xFF << (m << 3);
int mask_n = 0xFF << (n << 3);
mask = (mask_m | mask_n) ^ 0xFFFFFFFF;
int x_swapped = (x & mask) | (xm << (n <<3)) | (xn << (m <<3));
return x_swapped;
参考までに、符号付き値を右シフトした場合、高次ビットに0ではなく1が伝搬されることがありますが、これは実装定義です。 いずれにせよ、0xFFはこの問題を回避することができます。
関連
-
[解決済み】stdinとSTDIN_FILENOの違いは何ですか?
-
[解決済み】C言語で「関数の型が競合しています」と表示される、なぜ?
-
[解決済み】Cコンパイルエラーです。Idは1終了ステータスを返した
-
[解決済み】cudamalloc()の使用。) なぜダブルポインタなのか?
-
[解決済み] テスト
-
[解決済み】LinuxのI_PUSHに相当するもの
-
[解決済み】MySQLエラー#1071 - 指定されたキーが長すぎる; キーの最大長は767バイトです。
-
[解決済み】makefile:4。*** missing separator. 停止する
-
[解決済み】配列型char[]が代入できない [重複]。
-
[解決済み] TypeError: Python3でファイルへの書き込み時に'str'ではなくbytesのようなオブジェクトが要求される
最新
-
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 未知の型名「my_structure」。
-
[解決済み】警告:組み込み関数'printf'の非互換な暗黙の宣言(デフォルトで有効]
-
[解決済み】fgetsによるセグメンテーションフォールト(コアダンプ) - と思う。
-
[解決済み】C言語でint64_t型を表示する方法
-
[解決済み】「複数の定義」「最初に定義されたのはここです」エラーについて
-
[解決済み】インクリメントオペランドとして lvalue が必要です。
-
[解決済み】未定義参照 makefile が間違っているのかも?
-
[解決済み] エラー: `itoa` はこのスコープで宣言されていません。
-
[解決済み] Cプログラムで「配列の添え字が整数でない」。