論理演算子 (||、&&) のみを使用して、数値が偶数か偶数かを判断しようとしているときに、少し混乱しています。
私は慣れています:
if (x%2)
printf("Number is even");
else
printf("Number is not even");
数値のパリティを決定するアルゴリズムはありますか? ある場合は、いくつかのドキュメントを教えてもらえますか?
敬具、 デュルマン・エディ
論理演算子 (||、&&) のみを使用して、数値が偶数か偶数かを判断しようとしているときに、少し混乱しています。
私は慣れています:
if (x%2)
printf("Number is even");
else
printf("Number is not even");
数値のパリティを決定するアルゴリズムはありますか? ある場合は、いくつかのドキュメントを教えてもらえますか?
敬具、 デュルマン・エディ
論理演算子&&
andのみを使用することは不可能||
です。
&&
と のみを含む式では、値 (奇数) を(偶数) に||
置き換えることができます。論理演算子に関する限り、両方の値が論理的に「真」であるため、結果は同じになります。したがって、表現は両者を区別しません。0x01
0x10
正式に証明する必要がある場合は、これら 2 つの演算子のみを含みn
、合計で演算子を含む式はいずれかの形式の式と必然的に等価であるという(A) && (B)
事実(A) || (B)
をA
使用して、強力な帰納法によって証明できます。これらの 2 つの演算子のみで、合計で演算子B
よりも少ないものを含みます。n
で基本ケースを証明するのn == 1
は簡単です。
最初にシフトできますか?1 ビットだけを使用する場合は、論理演算子を使用して同じ「ビット」ロジックを実現できます。たとえば、次のようになります。
int num = 0x14; // 0000 0000 0001 0100
unsigned short shift_num = num << 15; // 0000 0000 0000 0000
if(shift_num && 1)
printf("it's odd\n");
else
printf("it's even\n");
したがって、0 以外のもの&& 1
はすべて 1 になります。この場合、最下位ビット以外はすべてシフトオフされます。(上記のように) 偶数の場合は 0 のままになり、0 && 1
偽であるため、出力"it's even"
されます。奇数を使用する場合:
int num = 0x15; // 0000 0000 0001 0101
unsigned short shift_num = num << 15; // 1000 0000 0000 0000
ここで 1 に 0 以外の数字があるので、次のようになります。"it's odd"
整数の場合、and 演算子x & 1
を使用してビット 0 の値をテストできます。つまり、偶数の場合は 0、奇数の場合は 1 です。
論理的||
で&&
常にyieldstrue
またはfalse
valueは1
orを意味し0
ます。
あなたは混乱していると思いますが||
&&
、&
|
後の方はビット演算子であり、ビット単位を使用すると、偶数と奇数を見つけることができます
if(n & 1)
printf("odd");
else
printf("even");
ビット単位の演算子&
andを意味していると仮定します|
(論理的な短絡の対応物には解決策がないため):
if(x&1)
puts("odd");
else
puts("even");
x&1
(そして、まともなコンパイラは、 を見たときにコードを自動的に出力しますx%2
)
これは、奇数または偶数&1
の の最下位ビットを抽出するため機能します。x
1
0