正数的原码,补码,反码都相同,都等于它本身
负数的补码是:符号位为1,其余各位求反,末位加1
反码是:符号位为1,其余各位求反,但末位不加1
也就是说,反码末位加上1就是补码
1100110011 原
1011001100 反 除符号位,按位取反
1011001101 补 除符号位,按位取反再加1
<<,有符号左移位,将运算数的二进制整体左移指定位数,低位用0补齐。
>>,有符号右移位,将运算数的二进制整体右移指定位数,整数高位用0补齐,负数高位用1补齐(保持负数符号不变)。
>>> 运算符把 expression1 的各个位向右移 expression2 指定的位数。右移后左边空出的位用零来填充。移出右边的位被丢弃。例如:
var temp
temp = -14 >>> 2
变量 temp 的值为 -14 (即二进制 / 的 11111111 11111111 11111111 11110010),
向右移两位后等于 1073741820 (即二进制的 00111111 11111111 11111111 11111100)。
1、用&判断奇数还是偶数
//因为设x为二进制最后一位,如果是奇数则为1;偶数则为0.
#include<stdio.h>
int main()
{
int a;
scanf("%d",&a);
if(a&1)
{
printf("奇");
}else
{
printf("偶");
}
}
2、用异或交换两个数的数值
//连续^三次即可
#include<stdio.h>
int main()
{
int a,b;
scanf("%d",&a);
scanf("%d",&b);
a=a^b;
b=a^b;
a=a^b;
printf("a=%d,b=%d",a,b);
}
正题
//a^a=0;a^0=a
#include <stdio.h>
int main()
{
int a[11]={
0,1,2,3,4,5,6,7,8,9,0};
scanf("%d",&a[10]);
int b=a[0];
//先把数组中的元素异或一遍
for(int i=1;i<11;i++)
{
b=b^a[i];
}
//再把数组中出现的元素异或一遍
int c=b^0^1^2^3^4^5^6^7^8^9;
printf("%d",c);
}