枚举
正负数十进制转二进制(位运算)(用枚举法做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 协议 ,转载请注明出处!