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

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分成两组,当两组都有数,且偶数个的组所有值取异或不为零时,另一组取异或的值极为其中一个满足的值。

C++程序设计基础(7)位运算相关推荐

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

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

  2. Bailian3718 位操作练习【位运算】

    位操作练习 总时间限制: 1000ms 内存限制: 65536kB 描述 给出两个不大于65535的非负整数,判断其中一个的16位二进制表示形式,是否能由另一个的16位二进制表示形式经过循环左移若干位 ...

  3. 位运算简介及实用技巧(二):进阶篇(1)

    =====   真正强的东西来了!   ===== 二进制中的1有奇数个还是偶数个     我 们可以用下面的代码来计算一个32位整数的二进制中1的个数的奇偶性,当输入数据的二进制表示里有偶数个数字1 ...

  4. c语言位运算符的应用,c语言位运算(c语言位运算符的用法)

    a=1^8 b=32^32 c=7^3 d=4&3 e=4|3 f=1&-1 求值 求详解 求值 为什么等于这么. 一.位运算符C语言提供了六种位运算符:& 按位与 | 按位或 ...

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

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

  6. 位运算(转自matrix67)

    http://www.matrix67.com/blog/archives/263 (原文链接) 什么是位运算? 程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算说穿了,就是直接对整数在内 ...

  7. c语言ox32左移一位的值,程序设计基础 (C)(32+32) 实验指导书.docx

    PAGE PAGE \* MERGEFORMAT30 1 ? ? <程序设计基础c>实验参考书? (草稿) ? ? ? ? ? ? ? ? 计算机学院 2017.06.01 ? 目录 TO ...

  8. 利用位运算和指针实现的交换两个数的程序

    位运算是C语言的一大特色,利用异或运算可以实现交换两个数,原理是一个整数与另外一个数进行两次异或运算仍然是其本身,基本原理用式子表达如下: (1) A ^ A = 0; (2) A = A ^B; ( ...

  9. 被程序员忽视的位运算

    在博客园潜水好久了,今天兴致高昂的想写一篇博客,写的内容就是最近刚刚弄懂的关于位运算的题目.可能对那些老鸟老说这些是在基础不过的东西了,但是我相信还是有很多的博客需要了解并掌握这个基础的. 做题目前首 ...

  10. 程序员面试金典 - 面试题 01.01. 判定字符是否唯一(位运算,牛)

    1. 题目 实现一个算法,确定一个字符串 s 的所有字符是否全都不同. 示例 1: 输入: s = "leetcode" 输出: false 示例 2: 输入: s = " ...

最新文章

  1. jquery 判断一个对象是否存在
  2. python第一次使用教程-Python考试_第一次
  3. QTP自动化测试自学手册V2.0版本
  4. Eclipse下配置struts很让我痛苦
  5. 并发编程——进程池与线程池
  6. 初玩PLSQL连接 Oracle
  7. IronPython项目有了新负责人
  8. 虚拟机几种网络连接方式的区别
  9. Java基础——Java反射机制及IoC原理
  10. Redis(九):Redis特殊类型之geospatial
  11. bzoj 1003物流运输 区间dp+spfa
  12. Tech.ED 2009特别奉献:Windows 7解读
  13. .net学习笔记图片链接20060523
  14. php获取当前文件夹下所有图片大小,PHP获取文件夹大小函数用法实例
  15. cophenet matlab,Matlab聚类分析[转]
  16. SAP 特殊字符的处理CL_ABAP_CHAR_UTILITIES(去除多余的换行符、换页符、Tab符)
  17. 数字翻译器,Java
  18. 如何删除PDF空白签名域?
  19. HTML和CSS实现京东首页(附GitHub地址)
  20. 分享88个搜索链接PHP源码,总有一款适合你

热门文章

  1. weblogic服务器连接池配置细节
  2. Java基础 【Arrays 类的使用】
  3. allegro中焊盘的设置
  4. jdbcTemplate查询方法
  5. Prototype源码浅析——Function.prototype部分(一)
  6. 蔡琴之《祈祷》纪念今日沪指逆境大涨
  7. C++之第一个程序Hello World,使用IO库输出Hello World
  8. SpringBoot集成Es使用ElasticSearchTemplate7.x版本自动注入失败解决
  9. Date型时间获取每周第一天,每月第一天,每季第一天,每年第一天
  10. java实现多线程抢单_JAVA实现多线程的四种方式