C言語上級チュートリアル(ビット演算と基数表現)


序文

この記事では、C言語のビット演算について説明します ビット演算は組み込みシステムでよく使われるので、C言語のビット演算について学びましょう。

1. 左右に移動

C 言語では、左シフト (<<) および右シフト (>>) はビット演算演算子であり、整数型データに対してビットレベルの演算を実行するために使用されます。これらの演算子は、整数値のバイナリ表現を指定されたビット数だけ左または右に移動し、移動の方向に応じてビットをパディングまたは廃棄します。

左シフト演算子 (<<) は、数値のすべての 2 進数を特定のビット数だけ左にシフトし、右側の空いたビットを 0 で埋めます。その構文は次のとおりです。

result = operand << n;

このうち、operandは演算対象の値、nは左シフトする桁数、resultは計算結果です。左シフト演算の効果は、オペランドの 2 進表現を左に n ビットシフトすることです。

たとえば、値が 5 の整変数 x があり、そのバイナリ表現が 0000 0101 であるとします。これを 2 桁分左にシフトします (つまり、x << 2)。

int x = 5;
int result = x << 2;

2 桁左にシフトすると、2 進値は 0001 0100 (2 進表現) になり、対応する 10 進数は 20 になります。したがって、結果の値は 20 になります。

右シフト演算子 (>>) は数値のすべての 2 進数を特定のビット数だけ右にシフトしますが、右シフト演算子には論理右シフトと算術右シフトの 2 つの方法があります。

逻辑右移(logical right shift):右移过程中左侧空出的位用零填充,适用于无符号数。

算术右移(arithmetic right shift):右移过程中左侧空出的位用符号位填充,适用于带符号数。

その構文は次のとおりです。

result = operand >> n;

このうち、operandは演算対象の値、nは右シフトする桁数、resultは計算結果です。右シフト演算の効果は、オペランドの 2 進表現を右に n ビットシフトすることです。

たとえば、値が 15 の符号付き整数変数 x があります (バイナリ表現は 0000 1111)。これを 3 桁右にシフトします。つまり、x >> 3 となります。

int x = 15;
int result = x >> 3;

論理右シフトの後、2 進値は 0000 0001 になり、対応する 10 進数は 1 になるため、結果の値は 1 になります。

右シフト演算では符号付き整数の符号ビットが保持されるため、元の値が負の場合 (符号ビットが 1)、算術右シフトで 1 が埋められるため、結果は負のままであることに注意してください。

2. 対応するビットを 0 にクリアし、対応するビットを 1 に設定します。

組み込みシステムでは、特定のビットをセットおよびクリアすることは非常に一般的ですが、ここでは、特定のビットを 1 にセットし、特定のビットを 0 にクリアする方法を見ていきます。

1.対応するビットを1に設定します

#include <stdio.h>


int main(void)
{
    
    
    unsigned char a = 0;
    int i = 0;
    scanf("%d", &i);

    printf("a = %d\n", a | (1 << i));//设置第i位为1

    return 0;
}


ビット演算子 | を使用して 1 を i ビット左にシフトし、結果に対して変数 a を使用してビット単位の OR 演算を実行します。これにより、変数 a の i 番目のビットが 1 に設定され、他のビットは変更されません。

2. 対応するビットを0にクリアします。

#include <stdio.h>


int main(void)
{
    
    
    unsigned char a = 255;
    int i = 0;
    scanf("%d", &i);

    printf("a = %d\n", a & ~(1 << i));

    return 0;
}

ビット演算子 ~ を使用して 1 を i ビット左にシフトし、結果に対して変数 a を使用してビットごとの AND 演算を実行します。これにより、変数 a の i 番目のビットが 0 に設定され、他のビットは変更されません。

3. 基数の表現

C 言語では、数値は 10 進数、8 進数、16 進数などのさまざまな基数で表現できます。以下は、これらのベースの表現と、対応する C コードの例です。

1. 10 進法: 10 進法は私たちの日常生活で最も一般的なシステムであり、数値はデフォルトで 10 進法です。たとえば、数値 42 は 10 進数です。

int decimalNumber = 42;

2. 8 進数: C 言語では、8 進数は 0 から始まります。たとえば、8 進数の 052 は 10 進数の 42 を表します。

int octalNumber = 052;

3. 16 進数: 16 進数は 0x または 0X で始まります。たとえば、16 進数 0x2A は 10 進数で 42 を表します。

int hexadecimalNumber = 0x2A;

これらの例は、C でさまざまな基数で数値を表現する方法を示しています。これらの表現を使用して、整変数の初期化、算術演算の実行、または画面への出力を行うことができます。C 言語ではデフォルトで 10 進数が使用されることに注意してください。他の基数間で変換する必要がある場合は、関連する関数や演算を使用して変換する必要がある場合があります。

4. & ^ | ~

1. ビット単位の AND &:

演算子: &
機能: ビットごとの AND 演算を実行し、2 つのオペランドの対応するビットを比較します。両方のビットが 1 の場合、結果のビットは 1 になり、それ以外の場合は 0 になります。
サンプルコード:

int x = 5; // 二进制表示为 0101
int y = 3; // 二进制表示为 0011
int result = x & y; // 结果为 0001,即 1

2. ビット単位の OR |:

演算子: |
機能: ビットごとの OR 演算を実行し、2 つのオペランドの対応するビットを比較します。いずれかのビットが 1 の場合、結果のビットは 1 になります。
サンプルコード:

int x = 5; // 二进制表示为 0101
int y = 3; // 二进制表示为 0011
int result = x | y; // 结果为 0111,即 7

3. ビットごとの XOR^:

演算子: ^
機能: ビットごとの XOR 演算を実行し、2 つのオペランドの対応するビットを比較します。2 つのビットが異なる場合、結果のビットは 1 になり、同じ場合は 0 になります。
サンプルコード:

int x = 5; // 二进制表示为 0101
int y = 3; // 二进制表示为 0011
int result = x ^ y; // 结果为 0110,即 6

4. ビット単位の否定~:

演算子: ~
機能: ビット単位の反転演算を実行し、整数の各 2 進ビットを反転し、1 を 0 に変更し、0 を 1 に変更します。
サンプルコード:

int x = 5; // 二进制表示为 0101
int result = ~x; // 结果为 1010,即 -6(根据补码表示)

要約する

この記事はここで終わりますが、ここまでで説明した知識をしっかりと理解していただければ幸いです。

おすすめ

転載: blog.csdn.net/m0_49476241/article/details/131879773