C 这个函数是如何工作的!(n&;1),为什么!在()之前,以及为什么n&;1、这是什么意思?

C 这个函数是如何工作的!(n&;1),为什么!在()之前,以及为什么n&;1、这是什么意思?,c,boolean,C,Boolean,《代码》是怎么写的!(n&1)工作,为什么在()之前,为什么n&1 #include <stdio.h> int even(int n) { return !(n & 1); } int main() { int pom, count=0,n; while(scanf("%d", &n)) { if(even(n)) { count++; } }

《代码》是怎么写的!(n&1)工作,为什么
()
之前,为什么
n&1

#include <stdio.h>
int even(int n)
{
    return !(n & 1);
}

int main()
{
    int pom, count=0,n;
    while(scanf("%d", &n))
    {
        if(even(n))

        {
            count++;
        }

    }
    printf("%d", count);
    return 0;
}
#包括
整数偶数(整数n)
{
返回!(n&1);
}
int main()
{
int pom,计数=0,n;
while(scanf(“%d”、&n))
{
if(偶数(n))
{
计数++;
}
}
printf(“%d”,计数);
返回0;
}
  • 是逻辑NOT运算符。当你给它一个零的值时,你得到一个;如果你通过了一个非零,你就会回到零
  • n&1
    1
    屏蔽
    int
    ,其具有二进制表示形式
    0000000000001
    ,即仅设置最后一位
  • 偶数的最后一位为零;奇数的最后一位有一个
现在您可以看到公式
!(n&1)
用于区分偶数和奇数

判断数字是否为偶数的另一种常用方法是检查2的整除性:

return n % 2 == 0;

此函数使用按位
&
运算符检查某些内容是否为偶数。数字
1
以二进制形式表示为
0001
。如果在32位二进制中有一个偶数,如
14
,它是
1110
,则
114&1
将是
0
。这是因为这两个数字之间没有公共位

1 1 1 0 - 14
0 0 0 1 - 1
0 0 0 0 - 0 (No common bit)
放进去
将结果反转,使其接受fasly
0
并将其转换为真实整数。但是,如果数字是奇数,如二进制中的
15
1111
,则有一个公共数字,并且
1111&1=1
。此处显示

1 1 1 1 - 15
0 0 0 1 - 1
0 0 0 1 - 1
!1
将truthy
1
转换为falsy
0
。规则是所有偶数
&1
都将
0
,因为从来没有公共位,但所有奇数
&1
都将
1
,因为总是有公共位。当<代码>
反转按位运算符的结果,您可以确定数字是偶数还是奇数


编辑:我意识到“反转”一词可能有歧义。我所说的反转是指它是这样做的<代码>!如果
n!=如果
n==0
,则0不为
0

如果
n
为奇数,则表达式
n&1
1
,如果n为偶数,则表达式
0
运算符将表达式视为布尔值(其中
1
变为
true
0
false
)并反转布尔值。如果
n
是偶数,
0
如果
n
是奇数,
n
则返回语句将值隐式转换回
int
给定
1
。是的,但它是递归函数还是正则函数?@TommyD此函数不是调用自身,因此它不是递归函数。后一种方法更好,因为它阐明了目的。体面的编译器将把它翻译成
指令。