算法学习笔记(5)-------位运算的tips
为什么80%的码农都做不了架构师?>>>
在计算机中所有数据都是以二进制的形式储存的。位运算其实就是直接对在内存中的二进制数据进行操作,因此处理数据的速度非常快。
在实际编程中,如果能巧妙运用位操作,完全可以达到四两拨千斤的效果,正因为位操作的这些优点,所以位操作在各大IT公司的笔试面试中一直是个热点问题。
以下就位运算的小诀窍进行总结供自己学习,大部分来自网上的。
交换两个整数(注意:在编译器中,针对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,交换完毕,不太理解的话可以自己写一个数的二进制进行测试。
变换符号--------变换符号就是将一个数从正数变到负数,从负数变到整数
例如:8-----00001000,对该数取反,为11110111+1----11111000------ -8
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相关推荐
- C++学习笔记-----用位运算实现加减乘除
C++学习笔记-----用位运算实现加减乘除 原文:http://blog.csdn.net/sinat_35261315/article/details/72904945 数据在计算机内存中是以二进 ...
- c语言用位运算将一个数清零,C语言学习笔记_位运算
C语言学习笔记_位运算 知识点记录 基本位运算 按位与:全1为1,见0为0:与1相与无变化,与0相与变为0:可用于特定位清零 按位或:见1为1,全0为0:与1相或变为1,与0相或无变化:可用于特定位置 ...
- 数据结构与算法XS班-左程云第一节课笔记(位运算、算法是什么、简单排序)
第1节 位运算.算法是什么.简单排序 ##这是数据结构与算法新手班-左程云第一节课的笔记## 1. 位运算 // 你们会不会表示一个数字的32位啊? // Java中int类型默认以32位二进制数在计 ...
- 【基础】基础算法学习笔记(状态空间)
基础算法学习笔记(状态空间) 一.状态空间 1.定义(什么是状态空间):一个实际问题的各种可能情况构成的集合.(解释:为什么需要算法来和程序来处理问题?如果一道题可以手算得到答案,换句话说就是存在通过 ...
- Python预测 数据分析与算法 学习笔记(特征工程、时间序列)
微信公众号:数学建模与人工智能 GitHub - QInzhengk/Math-Model-and-Machine-Learning 第3章 探索规律 3.1 相关分析 相关关系是一种与函数关系相区别 ...
- 数据结构与算法学习笔记之 从0编号的数组
数据结构与算法学习笔记之 从0编号的数组 前言 数组看似简单,但掌握精髓的却没有多少:他既是编程语言中的数据类型,又是最基础的数据结构: 一个小问题: 为什么数据要从0开始编号,而不是 从1开始呢? ...
- 基础才是王道——TCP/IP详解学习笔记 这位仁兄写得太好了
TCP/IP详解学习笔记 这位仁兄写得太好了 TCP/IP详解学习笔记 这位仁兄写得太好了. http://blog.csdn.net/goodboy1881/category/204448.as ...
- 数据结构与算法学习笔记4:递归+分治法
数据结构与算法学习笔记4 递归 斐波那契数列 青蛙跳台阶问题 链表倒序打印 分治法 二分查找/折半查找 Binary Search 题目1:快速幂 题目2:如何判断一个数是否为2的次幂 递归 指在函数 ...
- 数据结构与算法学习笔记15:最大流问题 / 二分图 / 有权无权二分图的匹配 / 匈牙利算法 / 银行家算法 / 稳定婚配
数据结构与算法学习笔记15:最大流问题 / 二分图 / 有权无权二分图的匹配 / 匈牙利算法 / 银行家算法 / 稳定婚配 引入小题:最短路径 最大流问题(maximum flow problem) ...
最新文章
- 常用的6款Java开源报表制作工具
- pytorch转caffe
- python求点到曲线距离_Python。如何从点和偏移距离的x,y列表中获取偏移样条曲线的x,y坐标...
- 运维与自动化系列③自动化部署基础与shell脚本实现
- instancing render
- 学位论文盲审被卡,或直接被毙,问题主要出在这几条!
- 初探mysql innodb集群_MySQL InnoDB Cluster搭建
- 终于给cs来了一次小整容
- CAD(2007)学习笔记
- solidity[4]-pure与view剖析
- 软件测试英语面试场景,软件测试英文面试题目
- 14 POJ3363 Annoying painting tool
- 原生JavaScript批量下载文件压缩包
- 盲打打字php,盲打26键打字口诀是什么
- 实习每日总结_20161212
- OpenCV:imwrite存储图像后为全黑
- Python+Vue计算机毕业设计安达驾校管理系统62e2u(源码+程序+LW+部署)
- 计算机一级考试大纲(详细版)
- 每日新闻:Gartner报告:这五大新兴科技趋势将模糊人机界限;阿里云肖力:阿里云安全三大“核驱动: 可信、智能、合规...
- 【学习笔记】GY-53L1x激光测距传感器模块入门资料