目次
2 整数 n を入力し、数値の 32 ビット 2 進数表現で 1 の数を出力します。
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");
}
}
}