C++程序设计基础(7)位运算
注:读《程序员面试笔记》笔记总结
1.知识点
运算 | 符号 | 说明 |
与 | & | 有0为0,都1为1 |
或 | | | 由1为1,都0为0 |
非(取反) | ~ | 0变1,1变0 |
异或 | ^ | 同为0,异为1 |
左移 | << | 高位移除,低位补零 |
右移 | >> | 低位移除,高位补0 |
1.1异或的性质
1 a^a==0 2 0^a==a 3 a^b^b==b^a^b==a
2.面试题
2.1不使用变量交换两个值
1 //method one 2 a = a - b;//save b message 3 b = a + b;//b= old a 4 a = b - a; 5 //method two 6 a = a ^ b; 7 b = a ^ b;//b= old a 8 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分成两组,当两组都有数,且偶数个的组所有值取异或不为零时,另一组取异或的值极为其中一个满足的值。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
SpringBoot整合Mybatis,使用通用mapper和PageHelper进行分页
乐哉码农 上节介绍了如何整合Security,这节就说下如何再Springboot下使用持久层框架mybatis和牛人封装的通用mapper与mybatis的整合,直接进入正题吧! 1.首先引入我们需要的依赖: 通用mapper PageHelper mybatis 2.mybatis的配置 配置myabtis有两种方式,一是通过javaconfig配置还有一种直接使用Springbot的配置文件进行设置:mybatis.mapper-locations=classpath:mapper/**/*.xml,但是我这里使用的是mybatis的注解方式所以连这个都不需要配置,另外还需要配置mapUnderscoreToCamelCase这个属性,这是用来我们做查或者新增的时候,mybatis自动会把我们的实体类按照驼峰格式转为数据库里面的下划线格式,好处就是不要写resultmap了。 3.通用mapper的集成 首先我们需要定义一个我们自己的通用mapper接口继承封装好的两个接口(都在tk里面) MyMapper.java 接下来我将我们对应的mapper继承这个mapper,使用ma...
- 下一篇
C++程序设计基础(8)main函数
注:读《程序员面试笔记》笔记总结 1.知识点 (2)main函数的形式 1 //first type 2 int main() 3 //second type 4 int main(int argc,char *argv[]) 不推荐使用void格式,以上两种方式函数以return 0结束; argc(argument count):代表参数的个数; argv(argument value):代表命令行输入的参数,其中argv[0]是程序名; 2.面试题 2.1键鼠main函数执行前后发生了什么 答案:main函数第一行代码执行之前会调用全局对象和静态对象的构造函数,初始化全局变量和静态变量;main函数 最后一行代码执行之后会调用atexit中注册的函数,并且调用顺序与注册顺序相反。
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Red5直播服务器,属于Java语言的直播服务器
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Linux系统CentOS6、CentOS7手动修改IP地址
- Hadoop3单机部署,实现最简伪集群
- Docker安装Oracle12C,快速搭建Oracle学习环境