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

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)位运算的更多相关文章

  1. JAVA程序开发按位运算的记录

    忘记在哪里看到一个面试题:把int a,b的值互换,不能使用临时变量.刚开始完全懵逼,脑子里面全是浆糊,不知道如何下手.查看答案后猛地一惊,心想居然还有这种操作,真是叹为观止,真的感觉自己的基础是如此 ...

  2. 我眼中的 Nginx(一):Nginx 和位运算

    作者张超:又拍云系统开发高级工程师,负责又拍云 CDN 平台相关组件的更新及维护.Github ID: tokers,活跃于 OpenResty 社区和 Nginx 邮件列表等开源社区,专注于服务端技 ...

  3. 说说Java 位运算

    前言 我们都知道,在计算机世界里,再复杂,再美的程序,到最后都会变成0与1.也就是我们常说的:二进制.二进制相信大家都很熟悉.与现实世界不同的是,在现实世界里,我们通常都是用十进制来表示的,也就是遇十 ...

  4. 我们必须要了解的Java位运算(不仅限于Java)

    本文原创地址为 https://www.cnblogs.com/zh94/p/16195373.html 原创声明:作者:陈咬金. 博客地址:https://www.cnblogs.com/zh94/ ...

  5. 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 ...

  6. 黑马程序员_毕向东_Java基础视频教程——位运算练习(随笔)

    位运算(练习) 最有效率的方式算出 2乘以 8等于几 2 << 3 = 2 * 2^3 = 2 * 8 = 16 对于两个整数变量的值进行互换(不需要第三方变量) class Test { ...

  7. C语言程序设计基础知识点概括

    C语言程序设计基础知识点概括 C语言程序设计基础知识点1.函数是C语言的基本构成单位.main函数是C语言程序的唯一入口.2.C语言程序开发过程. 编译过程:将以.c或.cpp结尾的源程序文件经过编译 ...

  8. Java程序设计基础项目总结报告

    Java程序设计基础项目总结报告 20135313吴子怡 一.项目内容 运用所学Java知识,不调用Java类库,实现密码学相关算法的设计,并完成TDD测试,设计运行界面. 二.具体任务 1.要求实现 ...

  9. Java程序设计基础作业目录(作业笔记)

    持续更新中............. Java程序设计基础笔记 • [目录] 我的大学笔记>>> 第1章 初识Java>>> 1.1.4 学生成绩等级流程图练习 1 ...

  10. 简简单单学会C#位运算

    一.理解位运算 要学会位运算,首先要清楚什么是位运算?程序中的所有内容在计算机内存中都是以二进制的形式储存的(即:0或1),位运算就是直接对在内存中的二进制数的每位进行运算操作 二.理解数字进制 上面 ...

随机推荐

  1. 重拾C,一天一点点_7

    标准库,atof()函数包含在头文件<stdlib.h>中 /******把字符串s转换为相应的双精度浮点数*******/ #include <stdio.h> #inclu ...

  2. Quicksort------代码之美

    #include<iostream> #include<cstdlib> #include<time.h> using namespace std; void sw ...

  3. 【大数据系统架构师】0.2 Linux基础

    1. Linux基本环境 1.1 大数据Hadoop前置大纲讲解 1)Linux系统,基本命令 2)Java语言,JavaSE相关知识 3)MySQL基本的DML和DDL 1.2 常见Linux系统. ...

  4. OOP2(虚函数/抽象基类/访问控制与继承)

    通常情况下,如果我们不适用某个函数,则无需为该函数提供定义.但我们必须为每个虚函数都提供定义而不管它是否被用到了,这因为连编译器也无法确定到底会适用哪个虚函数 对虚函数的调用可能在运行时才被解析: 当 ...

  5. loj #6046. 「雅礼集训 2017 Day8」爷

    #6046. 「雅礼集训 2017 Day8」爷 题目描述 如果你对山口丁和 G&P 没有兴趣,可以无视题目背景,因为你估计看不懂 …… 在第 63 回战车道全国高中生大赛中,军神西住美穗带领 ...

  6. spring security之logoutHandler中的CookieClearingLogoutHandler

    CookieClearingLogoutHandler实现LogoutHandler 接口 在退出登录时实现清除指定“name” 的cookie. 例:清除name为Authorization的coo ...

  7. CF702F T-Shirts FHQ Treap

    题意翻译 题目大意: 有n种T恤,每种有价格ci和品质qi.有m个人要买T恤,第i个人有vi元,每人每次都会买一件能买得起的qi最大的T恤.一个人只能买一种T恤一件,所有人之间都是独立的.问最后每个人 ...

  8. iOS开发时间戳与时间NSDate,时区的转换,汉字与UTF8,16进制的转换

    http://blog.sina.com.cn/s/blog_68661bd80101njdo.html 标签: ios时间戳 ios开发时间戳 ios16进制转中文 ios开发utf8转中文 ios ...

  9. thinkphp3.2.3 批量包含文件

    自己瞎写的...凑合看吧...核心就是用正则 表达式 或者 字符串 str_replace 进行 替换....... /** * 批量包含---,不能递归包含!!! 请不要在目标目录 包含 文件夹,因 ...

  10. HDOJ3085 Nightmare II 双向BFS

    重构一遍就A了...但这样效率太低了...莫非都要重构???QWQ 每一秒男同志bfs3层,女同志bfs1层.注意扩展状态时,要判一下合不合法再扩展,而不是只判扩展的状态合不合法,否则有可能由非法的走 ...