博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++程序设计基础(7)位运算
阅读量:7208 次
发布时间:2019-06-29

本文共 1848 字,大约阅读时间需要 6 分钟。

注:读《程序员面试笔记》笔记总结

1.知识点

运算 符号 说明
& 有0为0,都1为1
| 由1为1,都0为0
非(取反) ~ 0变1,1变0
异或 ^ 同为0,异为1
左移 << 高位移除,低位补零
右移 >> 低位移除,高位补0

1.1异或的性质

1 a^a==02 0^a==a3 a^b^b==b^a^b==a

2.面试题

2.1不使用变量交换两个值

1 //method one2 a = a - b;//save b message3 b = a + b;//b= old a4 a = b - a;5 //method two6 a = a ^ b;7 b = a ^ b;//b= old a8 a = a ^ b;

提示:利用位的运算性质

2.2计算二进制的1的个数

1 //method one  2 for ( count = 0; num != 0; num=num >> 1) { 3     if (num & 1) { 4         count++; 5     } 6 } 7 //method two 8 for ( count = 0; num != 0; num &= num - 1) {
//每次消掉最后的一个1 9 count++;10 }

提示:一个数与自身减一后与操作,会消除末尾的1,每次消除一个1

2.3将二进制数倒数第M位的前N位取反(比如M=2,N=4)

(1)将1左移N位(00000001=>00010000);

(2)将步骤一得到的数减1(00010000=>00001111);

(3)将步骤二得到的数左移M位(00001111=>00111100);

(4)得到的数字与原数字进行异或。

1 int getNum(int num, int n, int m) {2     int res = 1 << n;3     res--;4     res = res << m;5     return res ^ num;6 }

2.4找出人群中的唯一单身狗(一个数组中唯一一个数出现一次,其余的数都出现过偶数次,求该数)

1 int getSingleDog(int *a, int n) {2     int res = 0;3     for (int i = 0; i < n; i++) {4         res ^= a[i];5     }6     return res;7 }

提示:异或的性质b^b==0以及交换律

2.5(找出人群中三个单身狗中的任意一个)

1 #define BITNUM 32 2 int getSingelNum_OneOfThree(int *a, int len) { 3     for (int i = 0; i < BITNUM; i++) { 4         int countOdd = 0, countEven = 0; 5         int resOdd = 0, resEven = 0; 6         int tem = 1 << i; 7  8         for (int j = 0; j < len; j++) { 9             if (tem & a[j]) {10                 countOdd++;11                 resOdd ^= a[j];12             }13             else {14                 countEven++;15                 resEven ^= a[j];16             }17         }18 19         if (countOdd & 1 && resEven)//一组个数为奇数,另一组异或值不为零20             return resOdd;21         if (countEven & 1 && resOdd)//一组个数为奇数,另一组异或值不为零22             return resEven;23     }24     return -1;25 }

提示:按位从尾部根据0和1分成两组,当两组都有数,且偶数个的组所有值取异或不为零时,另一组取异或的值极为其中一个满足的值。

转载地址:http://jigum.baihongyu.com/

你可能感兴趣的文章
广州区块链公司-前端开发(node全栈)
查看>>
HTML标签样式初始化
查看>>
Vue代码模块定位插件vue-component-finder介绍
查看>>
vue 由0到1实现
查看>>
vue.js实现原理 -- 订阅者,发布者模式
查看>>
填坑-十万个为什么?(19)
查看>>
vue 使用svg图片 svg-sprite-loader
查看>>
idea实用插件
查看>>
iOS应用签名(下)
查看>>
【译】ObjectBox官方文档(6)——ObjectBox与Kotlin
查看>>
深入学习Activity生命周期
查看>>
168 Excel Sheet Column Title
查看>>
HTML学习--空元素
查看>>
未来三年人工智能将融入日常生活
查看>>
Django搭建个人博客:使用 Bootstrap 4 改写模板文件
查看>>
React Hooks 可以为我们带来什么,及为什么我觉得React才是前端的未来
查看>>
Spring Boot 实现定时任务的 4 种方式
查看>>
Astute Ex对区块链项目深度挖掘和发展
查看>>
一个简单的 命令行 图片压缩工具
查看>>
JavaScript之来龙去脉(一)
查看>>