一道算法题,(位运算)
2016-09-18 21:17
155 查看
两个数组,其中一个包含有n个数1 <= n <= 400000 另一个有n-1个数,数组中的数大小 <= 1000000000;数组中无重复数。
开始时利用第一个数组一次减去第二个数组。
我测试用的数据较小,所以运行起来没有问题,提交运行后不能全部通过。是由于两个数组中的数据并非有序。而且不是一一对应是由于,所以容易造成溢出问题。
使用异或解决。
遇到大数运算时,多采用位运算。
关于位运算。
运算符 含义
& 按位与
| 按位或
^ 按位异或
~ 取反
<< 左移
>> 右移
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。
开始时利用第一个数组一次减去第二个数组。
#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。
相关文章推荐
- 斐波那契数列:一道100年后羊圈羊的数量算法题
- CSDN论坛上的一道算法题
- 一天一道算法题--5.25--bfs或者最短路
- 【每日一道算法题】
- 一道算法题
- 一道算法题,引发的思考
- 机试算法讲解: 第57题 位运算
- 背包算法解决一道华为面试题
- 面试中遇到的一道算法题,请各位对我的算法指点一下
- 每天一道算法题——二进制数中1的个数
- 百度一道关于算法的面试题目
- 一天一道算法题--6.17--组合问题
- 数据结构与算法,每日一道
- 提高算法性能——位运算
- 每天一道算法题(六)深度优先算法(DFS)学习及Java实现
- 每日一道算法题——Container with Most Water
- 一道算法题:拼数字
- 一道迪杰斯特拉的算法题
- 一道算法题(负数左边,正数右边)的最优答案
- 每天一道算法题(5)——判断整数序列是否是二叉查找树后序遍历结果