优秀程序员不得不知道的20个位运算技巧
来源:互联网 发布:mac ipython 安装失败 编辑:程序博客网 时间:2024/05/21 10:26
一提起位运算,人们往往想到它的高效性,无论是嵌入式编程还是优化系统的核心代码,适当的运用位运算总是一种迷人的手段,或者当您求职的时候,在代码中写入适当的位运算也会让您的程序增加一丝亮点,最初当我读《编程之美》求“1的数目”时,我才开始觉得位运算是如此之美,后来读到 《Hacker's Delight》,感慨到Henry S.Warren把位运算运用的如此神出鬼没,很多程序都十分精妙,我觉得在一个普通的程序中大量运用这样的代码的人简直是疯了!但掌握简单的位运算技巧还是必要的,所以今天写这篇博文把我积累的一些位运算技巧分享给大家,这些技巧不会是如求“1的数目”的技巧,是最基本的一行位运算技巧!
Welcome To My BitTricks
1.获得int型最大值
int getMaxInt(){ return (1 << 31) - 1;//2147483647, 由于优先级关系,括号不可省略}
另一种写法
int getMaxInt(){return ~(1 << 31);//2147483647}
另一种写法
int getMaxInt(){//有些编译器不适用return (1 << -1) - 1;//2147483647}
C语言中不知道int占几个字节时候
int getMaxInt(){return ((unsigned int) - 1) >> 1;//2147483647}
2.获得int型最小值
int getMinInt(){return 1 << 31;//-2147483648 }
另一种写法
int getMinInt(){//有些编译器不适用return 1 << -1;//-2147483648}3.获得long类型的最大值
C语言版
long getMaxLong(){return ((unsigned long) - 1) >> 1;//2147483647}JAVA版
long getMaxLong(){return ((long)1 << 127) - 1;//9223372036854775807}获得long最小值,和其他类型的最大值,最小值同理.
4.乘以2运算
int mulTwo(int n){//计算n*2 return n << 1;}5.除以2运算
int divTwo(int n){//负奇数的运算不可用return n >> 1;//除以2}6.乘以2的m次方
int mulTwoPower(int n,int m){//计算n*(2^m)return n << m;}7.除以2的m次方
int divTwoPower(int n,int m){//计算n/(2^m)return n >> m;}8.判断一个数的奇偶性
boolean isOddNumber(int n){return (n & 1) == 1;}9.不用临时变量交换两个数(面试常考)
C语言版
void swap(int *a,int *b){(*a) ^= (*b) ^= (*a) ^= (*b);}通用版(一些语言中得分开写)
a ^= b;b ^= a;a ^= b;10.取绝对值(某些机器上,效率比n>0 ? n:-n 高)
int abs(int n){return (n ^ (n >> 31)) - (n >> 31);/* n>>31 取得n的符号,若n为正数,n>>31等于0,若n为负数,n>>31等于-1若n为正数 n^0=0,数不变,若n为负数有n^-1 需要计算n和-1的补码,然后进行异或运算,结果n变号并且为n的绝对值减1,再减去-1就是绝对值 */}11.取两个数的最大值(某些机器上,效率比a>b ? a:b高)
通用版
int max(int a,int b){return b & ((a-b) >> 31) | a & (~(a-b) >> 31);/*如果a>=b,(a-b)>>31为0,否则为-1*/}C语言版
int max(int x,int y){return x ^ ((x ^ y) & -(x < y));/*如果x<y x<y返回1,否则返回0,、 与0做与运算结果为0,与-1做与运算结果不变*/}12.取两个数的最小值(某些机器上,效率比a>b ? b:a高)
通用版
int min(int a,int b){return a & ((a-b) >> 31) | b & (~(a-b) >> 31);/*如果a>=b,(a-b)>>31为0,否则为-1*/}C语言版
int min(int x,int y){return y ^ ((x ^ y) & -(x < y)); /*如果x<y x<y返回1,否则返回0, 与0做与运算结果为0,与-1做与运算结果不变*/}13.判断符号是否相同
boolean isSameSign(int x, int y){ //有0的情况例外return (x ^ y) >= 0; // true 表示 x和y有相同的符号, false表示x,y有相反的符号。}
14.计算2的n次方
int getFactorialofTwo(int n){//n > 0return 2 << (n-1);//2的n次方}15.判断一个数是不是2的幂
boolean isFactorialofTwo(int n){return n > 0 ? (n & (n - 1)) == 0 : false;/*如果是2的幂,n一定是100... n-1就是1111.... 所以做与运算结果为0*/}16.对2的n次方取余
int quyu(int m,int n){//n为2的次方return m & (n - 1);/*如果是2的幂,n一定是100... n-1就是1111.... 所以做与运算结果保留m在n范围的非0的位*/}17.求两个整数的平均值
int getAverage(int x, int y){ return (x + y) >> 1; }
另一种写法
int getAverage(int x, int y){ return ((x ^ y) >> 1) + (x & y); /*(x^y) >> 1得到x,y其中一个为1的位并除以2, x&y得到x,y都为1的部分,加一起就是平均数了*/}
下面是三个最基本对二进制位的操作
18.从低位到高位,取n的第m位
int getBit(int n, int m){return (n >> (m-1)) & 1;}19.从低位到高位.将n的第m位置1
int setBitToOne(int n, int m){return n | (1 << (m-1));/*将1左移m-1位找到第m位,得到000...1...000 n在和这个数做或运算*/}20.从低位到高位,将n的第m位置0
int setBitToZero(int n, int m){
return n & ~(1 << (m-1));/* 将1左移m-1位找到第m位,取反后变成111...0...1111 n再和这个数做与运算*/}
另附一些对程序效率上没有实质提高的位运算技巧,一些也是位运算的常识(面试也许会遇到)
计算n+1
-~n计算n-1
~-n
取相反数
~n + 1;另一种写法
(n ^ -1) + 1;
if(x == a) x = b; if(x == b) x = a;
x = a ^ b ^ x;
sign函数,参数为n,当n>0时候返回1,n<0时返回-1,n=0时返回0
return !!n - (((unsigned)n >> 31) << 1);
- 优秀程序员不得不知道的20个位运算技巧
- 优秀程序员不得不知道的20个位运算技巧
- 优秀程序员不得不知道的20个位运算技巧
- 优秀程序员不得不知道的20个位运算技巧
- 优秀程序员不得不知道的20个位运算技巧
- 优秀程序员不得不知道的20个位运算技巧
- 优秀程序员不得不知道的20个位运算技巧
- 优秀程序员不得不知道的20个位运算技巧
- 优秀程序员不得不知道的20个位运算技巧
- 优秀程序员不得不知道的20个位运算技巧
- 优秀程序员不得不知道的20个位运算技巧
- 优秀程序员不得不知道的20个位运算技巧
- 优秀程序员不得不知道的20个位运算技巧
- 优秀程序员不得不知道的20个位运算技巧
- 优秀程序员不得不知道的20个位运算技巧 .
- 优秀程序员不得不知道的20个位运算技巧
- 优秀程序员不得不知道的20个位运算技巧
- 优秀程序员不得不知道的20个位运算技巧
- 《易-记事本》终于发布了!
- 在开发过程中如何运用UML 整理
- 关于IOS第三方库RegexKitLite使用正则表达式查找NSString中的IP地址
- 关于jsp中使用jstl对特殊字符的处理
- 【Android开发学习01】与Android实体设备的连接
- 优秀程序员不得不知道的20个位运算技巧
- TP驱动的sys节点建立
- 使用FusionCharts创建3D柱状图
- 查看class文件的源码!
- BCL-1338:真题之清华面试篇
- centos 5.5 yum 安装 php 的部分问题
- mysql的安装
- extJs4 中 panel 的 setTitle 的 一个显示 BUG
- 在什么时候用request.getAttribute
原创粉丝点击
热门IT博客
热门问题
老师的惩罚
人脸识别
我在镇武司摸鱼那些年
重生之率土为王
我在大康的咸鱼生活
盘龙之生命进化
天生仙种
凡人之先天五行
春回大明朝
姑娘不必设防,我是瞎子
民族学考研科目
民族学通论
民族学专业
民族学就业方向
云南大学民族学与社会学学院
西南民族大学学工网系统登录
中央民族大学民族学考研
广西民族大学民族学
中央民族大学民族学
民族志
少数民族的民风民俗
少数民族文艺
云南民族村旅游
民族村门票
昆明民族村
民族村
云南民族村门票
民族村门票多少钱
云南民族村门票价格
云南民族村旅游攻略
昆明民族村值得去吗
云南民族村附近住宿
云南民族村附近宾馆
昆明民族村门票多少钱
云南民族村好玩吗
云南民族村游玩攻略
中华民族文化村
昆明名族村
昆明云南民族村
民族村游玩攻略
云南名族村
云南名族村门票
云南民族村攻略
昆明民族村图片
民族村图片
云南民族村图片
云南民族文化村
昆明民族村门票
云南民族村简介
云南民族村表演时间表
民族舞速成班