C++程序设计基础(7)位运算
注:读《程序员面试笔记》笔记总结
1.知识点
| 运算 | 符号 | 说明 |
| 与 | & | 有0为0,都1为1 |
| 或 | | | 由1为1,都0为0 |
| 非(取反) | ~ | 0变1,1变0 |
| 异或 | ^ | 同为0,异为1 |
| 左移 | << | 高位移除,低位补零 |
| 右移 | >> | 低位移除,高位补0 |
1.1异或的性质
a^a==
^a==a
a^b^b==b^a^b==a
2.面试题
2.1不使用变量交换两个值
//method one
a = a - b;//save b message
b = a + b;//b= old a
a = b - a;
//method two
a = a ^ b;
b = a ^ b;//b= old a
a = a ^ b;
提示:利用位的运算性质
2.2计算二进制的1的个数
//method one
for ( count = ; num != ; num=num >> ) {
if (num & ) {
count++;
}
}
//method two
for ( count = ; num != ; num &= num - ) {//每次消掉最后的一个1
count++;
}
提示:一个数与自身减一后与操作,会消除末尾的1,每次消除一个1
2.3将二进制数倒数第M位的前N位取反(比如M=2,N=4)
(1)将1左移N位(00000001=>00010000);
(2)将步骤一得到的数减1(00010000=>00001111);
(3)将步骤二得到的数左移M位(00001111=>00111100);
(4)得到的数字与原数字进行异或。
int getNum(int num, int n, int m) {
int res = << n;
res--;
res = res << m;
return res ^ num;
}
2.4找出人群中的唯一单身狗(一个数组中唯一一个数出现一次,其余的数都出现过偶数次,求该数)
int getSingleDog(int *a, int n) {
int res = ;
for (int i = ; i < n; i++) {
res ^= a[i];
}
return res;
}
提示:异或的性质b^b==0以及交换律
2.5(找出人群中三个单身狗中的任意一个)
#define BITNUM 32
int getSingelNum_OneOfThree(int *a, int len) {
for (int i = ; i < BITNUM; i++) {
int countOdd = , countEven = ;
int resOdd = , resEven = ;
int tem = << i; for (int j = ; j < len; j++) {
if (tem & a[j]) {
countOdd++;
resOdd ^= a[j];
}
else {
countEven++;
resEven ^= a[j];
}
} if (countOdd & && resEven)//一组个数为奇数,另一组异或值不为零
return resOdd;
if (countEven & && resOdd)//一组个数为奇数,另一组异或值不为零
return resEven;
}
return -;
}
提示:按位从尾部根据0和1分成两组,当两组都有数,且偶数个的组所有值取异或不为零时,另一组取异或的值极为其中一个满足的值。
C++程序设计基础(7)位运算的更多相关文章
- JAVA程序开发按位运算的记录
忘记在哪里看到一个面试题:把int a,b的值互换,不能使用临时变量.刚开始完全懵逼,脑子里面全是浆糊,不知道如何下手.查看答案后猛地一惊,心想居然还有这种操作,真是叹为观止,真的感觉自己的基础是如此 ...
- 我眼中的 Nginx(一):Nginx 和位运算
作者张超:又拍云系统开发高级工程师,负责又拍云 CDN 平台相关组件的更新及维护.Github ID: tokers,活跃于 OpenResty 社区和 Nginx 邮件列表等开源社区,专注于服务端技 ...
- 说说Java 位运算
前言 我们都知道,在计算机世界里,再复杂,再美的程序,到最后都会变成0与1.也就是我们常说的:二进制.二进制相信大家都很熟悉.与现实世界不同的是,在现实世界里,我们通常都是用十进制来表示的,也就是遇十 ...
- 我们必须要了解的Java位运算(不仅限于Java)
本文原创地址为 https://www.cnblogs.com/zh94/p/16195373.html 原创声明:作者:陈咬金. 博客地址:https://www.cnblogs.com/zh94/ ...
- C#中缓存的使用 ajax请求基于restFul的WebApi(post、get、delete、put) 让 .NET 更方便的导入导出 Excel .net core api +swagger(一个简单的入门demo 使用codefirst+mysql) C# 位运算详解 c# 交错数组 c# 数组协变 C# 添加Excel表单控件(Form Controls) C#串口通信程序
C#中缓存的使用 缓存的概念及优缺点在这里就不多做介绍,主要介绍一下使用的方法. 1.在ASP.NET中页面缓存的使用方法简单,只需要在aspx页的顶部加上一句声明即可: <%@ Outp ...
- 黑马程序员_毕向东_Java基础视频教程——位运算练习(随笔)
位运算(练习) 最有效率的方式算出 2乘以 8等于几 2 << 3 = 2 * 2^3 = 2 * 8 = 16 对于两个整数变量的值进行互换(不需要第三方变量) class Test { ...
- C语言程序设计基础知识点概括
C语言程序设计基础知识点概括 C语言程序设计基础知识点1.函数是C语言的基本构成单位.main函数是C语言程序的唯一入口.2.C语言程序开发过程. 编译过程:将以.c或.cpp结尾的源程序文件经过编译 ...
- Java程序设计基础项目总结报告
Java程序设计基础项目总结报告 20135313吴子怡 一.项目内容 运用所学Java知识,不调用Java类库,实现密码学相关算法的设计,并完成TDD测试,设计运行界面. 二.具体任务 1.要求实现 ...
- Java程序设计基础作业目录(作业笔记)
持续更新中............. Java程序设计基础笔记 • [目录] 我的大学笔记>>> 第1章 初识Java>>> 1.1.4 学生成绩等级流程图练习 1 ...
- 简简单单学会C#位运算
一.理解位运算 要学会位运算,首先要清楚什么是位运算?程序中的所有内容在计算机内存中都是以二进制的形式储存的(即:0或1),位运算就是直接对在内存中的二进制数的每位进行运算操作 二.理解数字进制 上面 ...
随机推荐
- Markdown使用心得
1. 标题的使用 在使用标题时,如果为了层次清晰,可以在"#"后加上"1. "或者"1.1. "这种序号. 每一级标题的正文结束后,最好加一 ...
- dos窗口运行java文件需要jar依赖
执行java文件时候,有些里面依赖了java之外的jar,这是识别不到的,运行java命令的时候,带上jar路径: java -cp .;jar路径(加上jar名字) java文件名 例:java ...
- 【转】VS2010中无System.Data.OracleClient引用的问题
源地址:http://blog.csdn.net/pinchw/article/details/30465749
- python函数作用域,闭包,装饰器
第一:函数作用域: L:local 函数内部作用域 E:enclosing 函数内部与内嵌函数之间(闭包) G:global 全局作用域 B:build_in ...
- 题解 P2550 【[AHOI2001]彩票摇奖】
题目链接 大家有没有发现数据范围好小呀 我们只需要开7~8的数组就好!! 中间比较的时候懒得用for循环比较了.直接爆搜. 废话不多说,直接上代码. #include<bits/stdc++.h ...
- 洛谷 P2096 最佳旅游线路
某旅游区的街道成网格状.其中东西向的街道都是旅游街,南北向的街道都是林阴道.由于游客众多,旅游街被规定为单行道,游客在旅游街上只能从西向东走,在林阴道上则既可从南向北走,也可以从北向南走. 阿龙想到这 ...
- JDBC_时间处理_Date_Time_Timestamp区别_随机日期生成
import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement;import ...
- SqlBulkCopy使用注意事项
1. 有标识列的表 1.1 SqlBulkCopyOptions.KeepIdentity 必须设置!否则会出现复制过去的数据产生标识列发现变化的情况! 1.2 如果原表的标识列即为主键, 那按1. ...
- ajax返回数据成功 却进入error方法
应该是dataType的原因,dataType为json,但是返回的data不是json格式 于是将dataType:"json"去掉就ok了
- 安装python发行版本,并用conda来管理Environments,Python,packages
简介:anaconda指的是一个开源的python发行版本,其包含了conda.Python等180多个科学包及其依赖项. 因为包含了大量的科学包,Anaconda 的下载文件比较大(约 515 MB ...