lq1.2如何找数组中成对的那个数

在这里插入图片描述

在这里插入图片描述

正数的原码,补码,反码都相同,都等于它本身
负数的补码是:符号位为1,其余各位求反,末位加1
反码是:符号位为1,其余各位求反,但末位不加1
也就是说,反码末位加上1就是补码
1100110011 原
1011001100 反 除符号位,按位取反
1011001101 补 除符号位,按位取反再加1

<<,有符号左移位,将运算数的二进制整体左移指定位数,低位用0补齐。
在这里插入图片描述

>>,有符号右移位,将运算数的二进制整体右移指定位数,整数高位用0补齐,负数高位用1补齐(保持负数符号不变)。
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); 
}

猜你喜欢

转载自blog.csdn.net/June159/article/details/108369905