当我尝试使用逻辑运算符(||,&&)确定数字是否均匀/不均匀时,我有点困惑。
我习惯了:
if (x%2)
printf("Number is even");
else
printf("Number is not even");
是否有任何算法可以确定数字的奇偶校验?如果有的话,你能给我一些文件吗?
祝你好运, Duluman Edi
答案 0 :(得分:4)
仅使用逻辑运算符&&
和||
是不可能的。
在仅涉及&&
和||
的任何表达式中,您可以将0x01
(奇数)替换为0x10
(即偶数),结果将是相同的,因为就逻辑运算符而言,两个值在逻辑上都是“真”。因此,表达式不区分两者。
如果你需要正式证明它,你可以通过强引导来做到这一点,因为任何只涉及那两个运算符的表达式,总共包含n
个运算符,必然等同于表达式(A) && (B)
或(A) || (B)
,其中A
和B
是仅涉及这两个运算符且总共包含少于n
个运算符的表达式。用n == 1
证明基本案例很简单。
答案 1 :(得分:2)
对于一个整数,你可以使用和运算符x & 1
来测试第0位值,即偶数为0,奇数为1。
答案 2 :(得分:2)
你能先换班吗?如果仅使用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"
答案 3 :(得分:1)
假设您的意思是按位运算符&
和|
(因为它们的逻辑,短路对应物没有解决方案):
if(x&1)
puts("odd");
else
puts("even");
(当看到x&1
时,任何体面的编译器都会自动为x%2
发出代码
这是有效的,因为&1
提取x
的最低有效位,对于奇数和1
或偶数,它是0
。
答案 4 :(得分:1)
逻辑||
和&&
始终会产生true
或false
值意味着1
或0
。< / p>
我认为您在||
&&
和&
|
中感到困惑,后来的是按位运算符,使用按位可以找到偶数和奇数
if(n & 1)
printf("odd");
else
printf("even");