您的位置:首页 > 其它

一道算法题,(位运算)

2016-09-18 21:17 155 查看
两个数组,其中一个包含有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。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: