オペレーター演習

 

目次

1知識ポイント

2 整数 n を入力し、数値の 32 ビット 2 進数表現で 1 の数を出力します。

3 2 つの数値の 2 進数で異なるビットの数を見つける

4 整数バイナリの奇数ビットと偶数ビットを出力する

5 次のコードの結果は

6 整数パリティの判定(複数入力シナリオ)

7 母音か子音かを判断する(複数入力シナリオ)


1知識ポイント

(1) b = ++c, c++, ++a, a++ // コンマ式の優先度は最も低く、ここでは b=++c を最初に計算し、b は ++c の後に結果を取得し、b=++ c と次の形式は、左から右に計算されるコンマ式です。

(2) グローバル変数が初期化されていない場合、デフォルトで 0 に初期化されます。

(3) 式の評価は、暗黙の型変換、算術変換、演算子の優先順位、結合性、評価順序に注意する

2 整数 n を入力し、数値の 32 ビット 2 進数表現で 1 の数を出力します。

負の数は 2 の補数で表されます。要件:バイナリ パラメーターの 1 の数を返す関数を記述します。

コード 1 の表示: (注: これは、メモリ内の 2 の補数バイナリの 1 の数です)

#include <stdio.h>
int count_number_of_1(unsigned int n)
{
	int count = 0;
	while (n)
	{
		if (n % 2 == 1)
		{
			count++;
			n = n / 2;
		}
	}
	return count;
}
int main()
{
	int a =-1;
	int ret = count_number_of_1(a);
	printf("%d", ret);
	return 0;
}

注: 関数内に書かれているのは unsigned int (unsigned integer int)

コード分​​析:

7 の 2 進数列は 000000000000000000000000000111 で、7%2=1 の場合、この 1 は 2 進数の最後の桁、7/2=3、この 3 は 7 の 2 進数列を右に移動して表示される数値、00000000000000000000000000011 です。(この考え方では、10 進数として、各桁を知りたい場合は、通常、最初に %10 を割り、次に 10 で割ります)

コード 2 は次を示します。

#include <stdio.h>
int count_number_of_1(int n)
{
	int count = 0;
	int i = 0;
	for (i = 0; i < 32; i++)
	{
		if ((n & 1) == 1)
		{
			count++;
		}
		n = n >> 1;
	}
	return count;
}

int main()
{
	int a = -1;
	int ret = count_number_of_1(a);
	printf("%d", ret);
	return 0;
}

コード 3 は次を示します。

#include <stdio.h>
int count_number_of_1(int n)
{
	int count = 0;
	while (n)
	{
		n = n & (n - 1);
		count++;
	}
	return count;
}

int main()
{
	int a = -1;
	int ret = count_number_of_1(a);
	printf("%d", ret);
	return 0;
}

コードの理解:

m&(m-1) は、バイナリ シーケンスの右側から 1 を削除します (0111&0110=0110 0110&0101=0100)

(1を消すには1回実行、何回実行すれば1の数だけある)

(これが最良の答えです。複数の 1 がある場合は、数回ループするだけです。)

3 2 つの数値の 2 進数で異なるビットの数を見つける

2 つの int (32 ビット) 整数 m と n のバイナリ表現で異なるビット (ビット) の数

コード 1 は次を示します。

#include <stdio.h>
int count_diff_bit(int m, int n)
{
	int count = 0;
	int i = 0;
	for (i = 0; i < 32; i++)
	{
		if ((m & 1) != (n & 1))
		{
			count++;
		}
		m >>= 1;
		n >>= 1;
	}
	return count;
}

int main()
{
	int a = -1;
	int b = 1;
	int ret = count_diff_bit(a, b);
	printf("%d", ret);
	return 0;
}

コード 2 は次を示します。

#include <stdio.h>
int count_diff_bit(int m, int n)
{
	int count = 0;
	int i = m ^ n;
	while (i)
	{
		i = i & (i - 1);
		count++;
	}
	return count;
}

int main()
{
	int a = -1;
	int b = 1;
	int ret = count_diff_bit(a, b);
	printf("%d", ret);
	return 0;
}

 XOR は 0 と同じで、差は 1 です。結果は、バイナリ シーケンス内の 1 の数を見つけることに戻ります。

4 整数バイナリの奇数ビットと偶数ビットを出力する

整数バイナリ シーケンスのすべての偶数ビットと奇数ビットを取得し、バイナリ シーケンスをそれぞれ出力します。

#include <stdio.h>
void print(int m)
{
	int i = 0;
	for (i = 30; i >= 0; i -= 2)
	{
		printf("%d ", (m >> i) & 1);
	}

	printf("\n");
	for (i = 31; i >= 1; i -= 2)
	{
		printf("%d ", (m >> i) & 1);
	}
}

int main()
{
	int a = 5;
	scanf("%d", &a);
	print(a);
	return 0;
}

5 次のコードの結果は

#include <stdio.h> 
int i; 
int main() 
{ 
    i--; 
    if (i > sizeof(i)) 
    { 
        printf(">\n"); 
    } 
    else 
    { 
        printf("<\n"); 
    0を
    返します。 
}

A.> B.< C. 出力なし D. プログラムに問題がある

 解析:

C 言語では、0 は false で、ゼロ以外は true です。グローバル変数は、初期値が指定されていない場合、コンパイル時にデフォルトで 0 に初期化されます。

i の初期値は 0、i--result-1、i は整数、sizeof(i) は i のサイズを計算します type は 4、この分析によると、結果は B を選択する必要がありますが、戻り値の型はsizeof は実際には unsigned Integer であるため、コンパイラは左側の i を unsigned integer データに自動的に変換します.-1 に対応する unsigned integer は 4 または 8 を超える非常に大きな数であるため、実際には A を選択する必要があります

sizeof オペランド計算の結果の型は size_t unsigned integer type unsigned int この質問では、int > unsigned int は、-1 として使用する前に、まず int 型 (暗黙の型変換での算術変換用) を unsigned int 型に変換する必要があります。符号なし整数 (-1 の補数は 32 個の 1) と見なされる場合、元のコードの補数は同じである必要があり、-1 の符号なし整数は明らかに非常に大きく、4 より大きいため、選択する必要があります。あ

6 整数パリティの判定(複数入力シナリオ)

キーボードから任意の整数 (-231 ~ 231-1 の範囲) を入力し、そのパリティを判定するプログラムを作成します。      入力の説明:複数の入力セット。入力の各行には整数が含まれます。   出力の説明:入力の各行について、数値が奇数 (Odd) か偶数 (Even) かを出力します。

コード表示:

#include <stdio.h>
int main()
{
	int a = 0;
	while ((scanf("%d", &a)) != EOF)
	{
		if (a % 2 == 0)
		{
			printf("Even\n");
		}
		else
		{
			printf("Odd\n");
		}
	}
	return 0;
}

scanf が読み取りに失敗すると、EOF が返されます。

7 母音か子音かを判断する(複数入力シナリオ)

説明を入力してください:

複数入力、1 行に 1 文字。

出力の説明:

入力のセットごとに、出力は行で、入力文字が母音 (大文字と小文字を含む) の場合は「Vowel」を出力し、入力文字が非母音の場合は「子音」を出力します。

#include <stdio.h>
int main()
{
	char arr[] = { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U' };
	char ch = 0;
	while ((scanf("%c", &ch) != EOF))
	{
		int i = 0;
		for (i = 0; i < 10; i++)
		{
			if (ch == arr[i])
			{
				printf("Vowel\n");
				break;
			}
		}
		if (i == 10)
		{
			printf("Consonant\n");
		}
		getchar();
	}
}

知らせ:

キーボードで ch 型を取得する際に \n も入力されるので getchar() を使ってバッファをクリーンアップする

コード 2 は次を示します。

#include <stdio.h>
int main()
{
	char arr[] = { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U' };
	char ch = 0;
	while ((scanf("%c\n", &ch) != EOF))
	{
		int i = 0;
		for (i = 0; i < 10; i++)
		{
			if (ch == arr[i])
			{
				printf("Vowel\n");
				break;
			}
		}
		if (i == 10)
		{
			printf("Consonant\n");
		}
	}
}

コード 3 は次を示します。

#include <stdio.h>
int main()
{
	char arr[] = { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U' };
	char ch = 0;
	while ((scanf(" %c", &ch) != EOF))
	{
		int i = 0;
		for (i = 0; i < 10; i++)
		{
			if (ch == arr[i])
			{
				printf("Vowel\n");
				break;
			}
		}
		if (i == 10)
		{
			printf("Consonant\n");
		}
	}
}

おすすめ

転載: blog.csdn.net/m0_57388581/article/details/122870489