C 言語で 9 ビットを拡張する符号拡張
このチュートリアルでは、C 言語で 9 ビット整数を符号拡張する方法を学習します。まず、符号拡張が正確に何であるかを知る必要があります。
サイン拡張とは
符号拡張とは、たとえば 32 ビットから 64 ビットに変更することにより、符号ビットを維持しながら数値を拡張することを指します。符号ビットは、今日使用されている数値形式の中で常に最高です。
これは伝統の問題ですが、私たちが知る限り、常にそうです。これは、番号の他の部分の整合性を維持しながら、最も重要な番号の部分を新しい最高の場所に移動する必要があることを示しています。
C 言語で 9 ビット整数を符号拡張
C プログラミング言語の一部のビット演算子は、ハードウェアレベルで動作します。ただし、これらの演算子を使用するには、メモリのアーキテクチャと、C がメモリにデータを保存する方法を理解する必要があります。
構造:
- メモリは
char
タイプの文字ごとに 1 バイトに分割されます。 int
タイプのメモリ構造は 4 バイトで構成されています。short
タイプのメモリ位置は 2 バイトで構成されます。
標識に関する情報は、左端の部分にあります。数字の 1 は負の数を示し、数字の 0 は正の数を表します。
議論されていることをよりよく理解するために、次の例を見てみましょう。
まず、main()
クラスで、short
タイプの変数を作成し、それに val
という名前を付けます。次に、以下と同じ方法で変数を割り当てます。
short val = 234;
その後、9 ビットの数値と一緒に作成した short
値を res
という変数に提供します。
int res = val & 0b0000000111111111;
if
チェックが適用されます。これにより、(0x100)
を保持している最上位ビットである符号ビットが設定されているかどうかがチェックされ、設定されている場合は、その後に続くすべてのビットが配置されます。
if (val & 0x100) {
res = res | 0xFE00;
}
説明:
メモリ内に 16 ビットの小さな整数である val
変数を作成しました。次に、&
演算子を使用して、最新の 9 ビットをマスクしました。
これはビット演算で使用される AND
演算子であり、そのプロセスは次のとおりです。
X Y res
0 0 0
0 1 0
1 0 0
1 1 1
-
res
は結果を表し、X
とY
は多くの入力オプションを表します。計算は少しずつ行われます。同じ有効値を持つ両方のビットが 1 の場合にのみ、1 が生成されます。
-
したがって、ビット単位の
AND
演算子の値の最後の 9 ビットを分離すると、残りのビットが 0 に設定されます。値0b0000000111111111
はバイナリ表現に対応します。これは、最新の 9 ビットだけに 1 が含まれ、残りには 0 が含まれていることを示しています。
res
変数は結果で更新されます。 -
その後、
if
チェックを使用して最初のビットを確認しました。1 の場合は、結果に追加しました。それ以外の場合は、0 のままにします。
そのために、再びビット単位の AND
演算子を使用し、今回は最初のビットのみを抽出し、答えが 1 の場合は、|
を使用しました。演算子。ビット単位の OR
演算子であり、次のように機能します。
X Y res
0 0 0
0 1 1
1 0 1
1 1 1
-
res
は出力であり、X
とY
は入力の可能性です。ビットごとに計算されます。同じ有効ビットが両方とも 0 の場合にのみ、0 を出力します。
if
ステートメントでは、この演算子の結果が評価されます。true
の場合、ビット単位のOR
演算子を使用して、結果の左端のビットに 1 を挿入します。 -
0xFE00
は 2 進数の 16 進表現であり、符号ビットが存在する場合にその上のビットを設定するために使用されます。
C 言語のビット演算子を利用することで、他にもさまざまなことができます。C には、ビット単位の AND
およびビット単位の OR
よりも多くのビット演算子があります。
^
記号として表されるビット単位の XOR
があります。 〜
記号は、ビット単位の NOT
演算子を表します。
>>
記号は左シフト演算子を示します。 <<
記号を使用して右シフトを行うことができます。
これらのオペレーターの助けを借りて、さまざまな方法でこれまたは他の任意の望ましい仕事をすることができます。
完全なソースコード:
#include <stdio.h>
int main() {
short val = 234;
int res = val & 0b0000000111111111;
if (val & 0x100) {
res = res | 0xFE00;
}
return 0;
}
I have been working as a Flutter app developer for a year now. Firebase and SQLite have been crucial in the development of my android apps. I have experience with C#, Windows Form Based C#, C, Java, PHP on WampServer, and HTML/CSS on MYSQL, and I have authored articles on their theory and issue solving. I'm a senior in an undergraduate program for a bachelor's degree in Information Technology.
LinkedIn