一道算法题,(位运算)

两个数组,其中一个包含有n个数1 <= n <= 400000 另一个有n-1个数,数组中的数大小 <= 1000000000;数组中无重复数。

开始时利用第一个数组一次减去第二个数组。

#include "stdio.h"
int main(){
		int num = 4;
		int all[] = {1000,10003,10002,123456};
		int a[] = {1000,10003,123456};
		int liu = 0;
		for(int i = 0; i < num-1; i++){
			liu = all[i] - a[i];
		}
		liu = liu - all[num-1];
		printf("%d \n",liu);
		return 1;
}

我测试用的数据较小,所以运行起来没有问题,提交运行后不能全部通过。是由于两个数组中的数据并非有序。而且不是一一对应是由于,所以容易造成溢出问题。

使用异或解决。

#include "stdio.h"
int main(){
		int num = 4;
		int all[] = {1000,10003,10002,123456};
		int a[] = {1000,10003,123456};
		int liu = 0;
		for(int i = 0; i < num-1; i++){
			liu = all[i]^a[i];
		}
		liu = liu ^ all[num-1];
		printf("%d \n",liu);
		return 1;
}


遇到大数运算时,多采用位运算。

关于位运算。

运算符  含义
&    按位与
|    按位或
^    按位异或
~    取反
<<   左移
>>   右移

1,按位与运算符(&)

运算规则:0&0=0;   0&1=0;    1&0=0;     1&1=1;

即:两位同时为“1”,结果才为“1”,否则为0

2 按位或运算符 |

0|0=0; 0|1=1; 1|0=1; 1|1=1;
两个相应的二进位中只要有一个为 1,该位的结果就为 1。
3 异或运算符 ^
异或运算符 ^ 也称 XOR 运算符。它的规则是若参加运算的两个二进位同号,则结果为0,异号则为1。

即 0^0=0; 0^1=1; 1^0=1;1^1=0;
4 取反运算符 ~
~是一个头单目运算符,用来对一个二进制按位取反,即将 0 变 1,1变 0。例如~25 是对八进制数 25 (即 00010101)按位取反。
5 左移运算符 <<
用来将一个数各二进位全部左移若干位。例如:a = a << 2;
将 a 的二进制数左移 2 位,右补 0,若 a = 15,即二进制数 00001111,左移2位得到 00111100,即十进制数60.
 高位左移后溢出,舍弃不起作用。左移一位相当于该数乘以2。但些结论只适用于该数左移时被溢出舍弃的高位中不包含1 的情况。

6右移运算符 >>
a >> 2 表示将 a 的各二进位右移 2 位。移到右端的低位被舍弃,对无符号数,高位补 0。如 a = 017 时:a = 00001111 >> 2
00000011
右移一位相当于除以 2 ,右移 n 位相当于除于 2^n。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值