枚举

正负数十进制转二进制(位运算)(用枚举法做POJ1222)

#include<stdio.h>
int main()
{
    int x,i;
    scanf("%d",&x);
    for(i=5;i>=0;i--)
        printf("%d",x>>i&1);
    printf("\n");
    return 0;
}

intput:

1

output:

000001

重点就在 x>>i&1,按位与(&) :0&0=0 ,0&1=0 , 1&0=0 ,1&1=1,奇数的二进制最后一位全部为1,而偶数的二进制最后一位全部为0,那么用按位与运算符我们可以很方便地知道一个数是奇数还是偶数,只要让数字&1 就可以了,因为 奇数&1=1 ,而 偶数&1=0。(类似于C语言书P230利用按位与清零的方法)

还有一道容斥原理中的二进制法。

异或找奇数次

HDU 2095

统计所有数字出现的次数,然后输出奇数次的那个数。

利用异或运算。 符号是^. 异或是个位运算符号,具体是怎么操作的请百度,这里有个特性使得他能产生一种巧方法

a^a=0 0^c=c 看到上面这个式子是否你懂了呢?

没错,例如样例 5 1 1 3 2 2

如果我们用异或运算计算就是 1^1^3^2^2

由于1^1=0 2^2=0,那么就只剩下了唯一的一个3了。

如果有3个3,那么前面偶数个3由于3^3=0,势必也会只留下一个孤单的3. 那么答案就只能是那个多余的数字了。

#include <stdio.h>  
int main()  
{  
    int n,x,ans;  
    while(scanf("%d",&n)!=EOF)  
    {  
        ans = 0;  
        while(n--)  
        {  
            scanf("%d",&x);  
            ans ^= x;  
        }  
        printf("%d\n",ans);  
    }  
    return 0;  
 }
求某数除以最大的2的次方数的余数

a&-a(比如10,结果就是2,但是如果是8的话,结果是8)


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!

博弈 Previous
容斥原理&&欧拉函数 Next