当我尝试仅使用逻辑运算符(||,&&)来确定一个数字是否是偶数/奇数时,我有点困惑。
我习惯:
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
偶数),结果将是相同的,因为就逻辑运算符而言,这两个值在逻辑上都是“真”。因此,该表达式不区分两者。
如果你需要正式证明它,你可以通过强归纳来做到这一点,即任何只涉及这两个运算符并且总共包含n
运算符的表达式必然等价于(A) && (B)
or形式的表达式(A) || (B)
,其中A
和B
是涉及的表达式只有这两个运算符并且总共包含少于n
运算符。证明基本情况n == 1
很简单。
对于整数,您可以使用 and 运算符x & 1
来测试位 0 的值,即 0 表示偶数,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
现在有一个非 0 数字和 1 所以我们会得到"it's odd"
假设您的意思是按位运算符&
和|
(因为它们的逻辑短路对应物没有解决方案):
if(x&1)
puts("odd");
else
puts("even");
x&1
(并且任何体面的编译器都会在看到时自动发出代码x%2
)
这是有效的,因为&1
提取了 的最低有效位x
,即1
奇数和0
偶数。
合乎逻辑||
且&&
总是产生true
或false
值的意思是1
or 0
。
我认为您对此感到困惑,||
&&
后来&
|
的运算符是按位运算符,使用按位可以找到偶数和奇数
if(n & 1)
printf("odd");
else
printf("even");