为什么80%的码农都做不了架构师?>>>   

在计算机中所有数据都是以二进制的形式储存的。位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快。

在实际编程中,如果能巧妙运用位操作,完全可以达到四两拨千斤的效果,正因为位操作的这些优点,所以位操作在各大IT公司的笔试面试中一直是个热点问题。

以下就位运算的小诀窍进行总结供自己学习,大部分来自网上的。

  1. 交换两个整数(注意:在编译器中,针对double或float的位运算会报错)

int swap(int &a, int &b)
{if (a != b){a ^= b;b ^= a;a ^= b;}return 0;
}

我们可以这样理解,第一步a=a^b,第二步b=a^b=(a^b)^b=a^(b^b)=a;第三步:a=a^b=(a^b)^a=(a^a)^b=b,交换完毕,不太理解的话可以自己写一个数的二进制进行测试。

  1. 变换符号--------变换符号就是将一个数从正数变到负数,从负数变到整数

    例如:8-----00001000,对该数取反,为11110111+1----11111000------ -8

  2. int SignReversal(int a)
    {return (~a + 1);
    }

求绝对值------

首先判断这个数是否是负数,将其右移31位,得到符号位,符号位为-1则是负数,符号位是0则是正数。由交换符号推导可知,负数专为整数则位取反+1

int abs(int a)
{int flag = (a >> 31);return (flag == 0) ? a: (~a + 1);
}

对以上的方法代码还可以进行优化,我们知道,任何一个数与0亦或等于本身,与-1即0XFFFFFFFF亦或相当于位取反,再加一就是对该数交换符号。故代码可以如下所写:

int myAbs(int a)
{int flag = (a >> 31);return ((a^flag) - flag);
}

高低位交换----------

给出一个无符号的16位数,称这个数的前8位为"高位",后8位为"低位", 要求将这个数的"高位"转为"低位",“低位”转为“高位”。假设这个数的16位为x1x2x3x4x5x6x7x8 y1y2y3y4y5y6y7y8,将其位右移8位,则高位自动补0,结果为00000000 x1x2x3x4x5x6x7x8,再将该数位左移8位,其低位自动补0,y1y2y3y4y5y6y7y8 00000000,将这两个结果亦或即可将高低位交换,代码如下:

#include<iostream>
#include<string>
using namespace std;
template <class T>
void printBinary(T a)
{for (int i=sizeof(a)*8-1; i>=0; i--){if ((a >> i) == 1)cout <<'1';else cout << '0';if (i == (sizeof(a)*8-1)/2+1)cout <<' ';}cout << endl;
}int main()
{unsigned short a;unsigned short b;cin >> a;b = ((a>>8)|(a<<8));printBinary(a);printBinary(b);return 0;
}

转载于:https://my.oschina.net/u/866703/blog/209416

算法学习笔记(5)-------位运算的tips相关推荐

  1. C++学习笔记-----用位运算实现加减乘除

    C++学习笔记-----用位运算实现加减乘除 原文:http://blog.csdn.net/sinat_35261315/article/details/72904945 数据在计算机内存中是以二进 ...

  2. c语言用位运算将一个数清零,C语言学习笔记_位运算

    C语言学习笔记_位运算 知识点记录 基本位运算 按位与:全1为1,见0为0:与1相与无变化,与0相与变为0:可用于特定位清零 按位或:见1为1,全0为0:与1相或变为1,与0相或无变化:可用于特定位置 ...

  3. 数据结构与算法XS班-左程云第一节课笔记(位运算、算法是什么、简单排序)

    第1节 位运算.算法是什么.简单排序 ##这是数据结构与算法新手班-左程云第一节课的笔记## 1. 位运算 // 你们会不会表示一个数字的32位啊? // Java中int类型默认以32位二进制数在计 ...

  4. 【基础】基础算法学习笔记(状态空间)

    基础算法学习笔记(状态空间) 一.状态空间 1.定义(什么是状态空间):一个实际问题的各种可能情况构成的集合.(解释:为什么需要算法来和程序来处理问题?如果一道题可以手算得到答案,换句话说就是存在通过 ...

  5. Python预测 数据分析与算法 学习笔记(特征工程、时间序列)

    微信公众号:数学建模与人工智能 GitHub - QInzhengk/Math-Model-and-Machine-Learning 第3章 探索规律 3.1 相关分析 相关关系是一种与函数关系相区别 ...

  6. 数据结构与算法学习笔记之 从0编号的数组

    数据结构与算法学习笔记之 从0编号的数组 前言 数组看似简单,但掌握精髓的却没有多少:他既是编程语言中的数据类型,又是最基础的数据结构: 一个小问题: 为什么数据要从0开始编号,而不是 从1开始呢? ...

  7. 基础才是王道——TCP/IP详解学习笔记 这位仁兄写得太好了

    TCP/IP详解学习笔记 这位仁兄写得太好了 TCP/IP详解学习笔记   这位仁兄写得太好了. http://blog.csdn.net/goodboy1881/category/204448.as ...

  8. 数据结构与算法学习笔记4:递归+分治法

    数据结构与算法学习笔记4 递归 斐波那契数列 青蛙跳台阶问题 链表倒序打印 分治法 二分查找/折半查找 Binary Search 题目1:快速幂 题目2:如何判断一个数是否为2的次幂 递归 指在函数 ...

  9. 数据结构与算法学习笔记15:最大流问题 / 二分图 / 有权无权二分图的匹配 / 匈牙利算法 / 银行家算法 / 稳定婚配

    数据结构与算法学习笔记15:最大流问题 / 二分图 / 有权无权二分图的匹配 / 匈牙利算法 / 银行家算法 / 稳定婚配 引入小题:最短路径 最大流问题(maximum flow problem) ...

最新文章

  1. 常用的6款Java开源报表制作工具
  2. pytorch转caffe
  3. python求点到曲线距离_Python。如何从点和偏移距离的x,y列表中获取偏移样条曲线的x,y坐标...
  4. 运维与自动化系列③自动化部署基础与shell脚本实现
  5. instancing render
  6. 学位论文盲审被卡,或直接被毙,问题主要出在这几条!
  7. 初探mysql innodb集群_MySQL InnoDB Cluster搭建
  8. 终于给cs来了一次小整容
  9. CAD(2007)学习笔记
  10. solidity[4]-pure与view剖析
  11. 软件测试英语面试场景,软件测试英文面试题目
  12. 14 POJ3363 Annoying painting tool
  13. 原生JavaScript批量下载文件压缩包
  14. 盲打打字php,盲打26键打字口诀是什么
  15. 实习每日总结_20161212
  16. OpenCV:imwrite存储图像后为全黑
  17. Python+Vue计算机毕业设计安达驾校管理系统62e2u(源码+程序+LW+部署)
  18. 计算机一级考试大纲(详细版)
  19. 每日新闻:Gartner报告:这五大新兴科技趋势将模糊人机界限;阿里云肖力:阿里云安全三大“核驱动: 可信、智能、合规...
  20. 【学习笔记】GY-53L1x激光测距传感器模块入门资料

热门文章

  1. ionic app 优化三件套,让其更贴近原生app
  2. [BZOJ1030] [JSOI2007] 文本生成器 (AC自动机 dp)
  3. 放回采样最终不同样本数量
  4. Amazon S3数据一致性模型
  5. 大熊君大话NodeJS之------Net模块
  6. 服务器端 OR 客户端
  7. 3. 设计模式之创建模式
  8. Android 2.2 带来全新拍照增强特性
  9. Android之选项卡
  10. Hadoop编译打包记录