一提起位运算,人们往往想到它的高效性,无论是嵌入式编程还是优化系统的核心代码,适当的运用位运算总是一种迷人的手段,或者当您求职的时候,在代码中写入适当的位运算也会让您的程序增加一丝亮点,最初当我读《编程之美》求“1的数目”时,我才开始觉得位运算是如此之美,后来读到 《Hacker's Delight》,感慨到Henry S.Warren把位运算运用的如此神出鬼没,很多程序都十分精妙,我觉得在一个普通的程序中大量运用这样的代码的人简直是疯了!但掌握简单的位运算技巧还是必要的,所以今天写这篇文章把我积累的一些位运算技巧分享给大家,这些技巧不会是如求“1的数目”的技巧,是最基本的一行位运算技巧!

一.获得int型最大值

复制代码代码如下:

int getMaxInt(){  
        return (1<<31) - 1;//2147483647, 由于优先级关系,括号不可省略  
}  

另一种写法

复制代码代码如下:

int getMaxInt(){  
    return -(1<<-1) - 1;//2147483647  
}  

另一种写法

复制代码代码如下:

int getMaxInt(){  
    return ~(1<<31);//2147483647  
}  

C语言中不知道int占几个字节时候

复制代码代码如下:

int getMaxInt(){  
    return ((unsigned int)-1) >> 1;//2147483647  
}  

二.获得int型最小值

复制代码代码如下:

int getMinInt(){  
    return 1<<31;//-2147483648  
 }  

另一种写法

复制代码代码如下:

int getMinInt(){  
    return 1 << -1;//-2147483648  
}  

三.获得long类型的最大值

C语言版

复制代码代码如下:

long getMaxLong(){  
    return ((unsigned long)-1) >> 1;//2147483647  
}  

JAVA版

复制代码代码如下:

long getMaxLong(){  
    return ((long)1<<127)-1;//9223372036854775807  
}  

获得long最小值,和其他类型的最大值,最小值同理.

四.乘以2运算

复制代码代码如下:

int mulTwo(int n){//计算n*2   
    return n<<1;  
}

五.除以2运算

复制代码代码如下:

int divTwo(int n){//负奇数的运算不可用  
    return n>>1;//除以2  
}

六.乘以2的m次方

复制代码代码如下:

int divTwoPower(int n,int m){//计算n/(2^m)  
    return n>>m;  
}  

七.除以2的m次方

复制代码代码如下:

int divTwoPower(int n,int m){//计算n/(2^m)  
    return n>>m;  
}  

八.判断一个数的奇偶性

复制代码代码如下:

boolean isOddNumber(int n){  
    return (n & 1) == 1;  
}  

九.不用临时变量交换两个数(面试常考)

C语言版

复制代码代码如下:

void swap(int *a,int *b){     
    (*a)^=(*b)^=(*a)^=(*b);   
}

通用版(一些语言中得分开写)

复制代码代码如下:

a ^= b;  
b ^= a;  
a ^= b;  

十.取绝对值(某些机器上,效率比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就是绝对值 */  
}

十一.取两个数的最大值(某些机器上,效率比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做与运算结果不变*/  
}  

十二.取两个数的最小值(某些机器上,效率比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做与运算结果不变*/  
}  

十三.判断符号是否相同

复制代码代码如下:

boolean isSameSign(int x, int y){  
    return (x ^ y) > 0; // true 表示 x和y有相同的符号, false表示x,y有相反的符号。  
}  

十四.计算2的n次方

复制代码代码如下:

int getFactorialofTwo(int n){//n > 0  
    return 2<<(n-1);//2的n次方  
}

十五.判断一个数是不是2的幂

复制代码代码如下:

boolean isFactorialofTwo(int n){  
    return (n & (n - 1)) == 0;  
    /*如果是2的幂,n一定是100... n-1就是1111.... 
       所以做与运算结果为0*/  
}  

十六.对2的n次方取余

复制代码代码如下:

int quyu(int m,int n){//n为2的次方  
    return m & (n - 1);  
    /*如果是2的幂,n一定是100... n-1就是1111.... 
     所以做与运算结果保留m在n范围的非0的位*/  
}  

十七.求两个整数的平均值

复制代码代码如下:

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的部分,加一起就是平均数了*/

}

下面是三个最基本对二进制位的操作

十八.从低位到高位,取n的第m位

复制代码代码如下:

int getBit(int n, int m){  
    return (n >> (m-1)) & 1;  
}  

十九.从低位到高位.将n的第m位置1

复制代码代码如下:

int setBitToOne(int n, int m){  
    return n | (1<<(m-1));  
    /*将1左移m-1位找到第m位,得到000...1...000 
      n在和这个数做或运算*/  
}

二十.从低位到高位,将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个位运算技巧相关推荐

  1. C语言中如何把位赋值给字节,优秀程序员必须知道的20个位运算技巧

    一提起位运算,人们往往想到它的高效性,无论是嵌入式编程还是优化系统的核心代码,适当的运用位运算总是一种迷人的手段,或者当您求职的时候,在代码中写入适当的位运算也会让您的程序增加一丝亮点,最初当我读&l ...

  2. 成长中必须知道的20个故事 (藏)---(转)

    成长中必须知道的20个故事 1.断箭不相信自己的意志,永远也做不成将军. 春秋战国时代,一位父亲和他的儿子出征打战.父亲已做了将军,儿子还只是马前卒.又一阵号角吹响,战鼓雷鸣了,父亲庄严地托起一个箭囊 ...

  3. 成长中必须知道的20个故事(摘自:魅族明的上古卷轴)

    成长中必须知道的20个故事 1.断箭 不相信自己的意志,永远也做不成将军. 春秋战国时代,一位父亲和他的儿子出征打战.父亲已做了将军,儿子还只是马前卒.又一阵号角吹响,战鼓雷鸣了,父亲庄严地托起一个箭 ...

  4. 分享下剪辑师必须知道的13个剪辑技巧!

    最基本的影片剪辑手法就是剪接了,从一个镜头跳到另一个镜头,改变视角.推进故事.很多手法很常用很自然,一般你都不会留意.今天给大家分享剪辑师必须知道的13个剪辑技巧!希望你能领略每一招的用法和寓意,最终 ...

  5. 弘辽科技:直播行业下半场弯道超车必须知道的20个要点

    原标题<弘辽科技:直播行业下半场弯道超车必须知道的20个要点> 2021·直播论剑 有生之年系列的2020已过,那么,2021年的直播电商将如何发展与变化? 为你揭示2021年直播电商行业 ...

  6. 计算机专业可以报特岗吗,报考特岗前必须知道的20个真相

    原标题:报考特岗前必须知道的20个真相 最近特岗的热度真的非常大 因为确定明年又要招啦 这问题又来了 专科生可以报考特岗教师吗? 没有教师资格证怎么办? 专业不对口可以吗? 报考特岗教师前你必须知道的 ...

  7. 【转贴】你必须知道的20个故事

    [转贴]人成长中须知道的20个故事 1.断箭----不相信自己的意志,永远也做不成将军. 春秋战国时代,一位父亲和他的儿子出征打战.父亲已做了将军,儿子还只是马前卒.又一阵号角吹响,战鼓雷鸣了,父亲庄 ...

  8. 作为软件工程师,你必须知道的20个常识

    1.针对面向对象的设计与分析:为了让软件有更好的可维护性,重用性以及快速开发, 简短的 OOAD 与它的 SOLID 原则对于每一个软件工程师来说都是该牢记的. 2.软件品质因素:软件工程的好坏与软件 ...

  9. 软件工程师必须知道的20个常识

    作为一名优秀是软件开发工程师,以下的这些常识你知道吗?在实际工作中有没有总结过呢?小编就带大家一起分享这20个软件开发常识. 1.针对面向对象的设计与分析:为了让软件有更好的可维护性,重用性以及快速开 ...

最新文章

  1. 华盛顿大学《生成模型》2020秋季课程完结,课件、讲义全部放出
  2. 用python实现微信消息群发和微信自动回复
  3. 832. Flipping an Image
  4. android+3.0新加的动画,Android动画片
  5. mui请求php,PHP 怎样处理mui.ajax POST过来的数据?
  6. RAC crs_stat unknown资源状态处理
  7. SLAM算法中的数据关联问题
  8. 手机mt4一键平仓所有_手机一键就能提取PPT所有文字!10秒完成,这波操作好用到你害怕...
  9. 存储路径_KUKA C4机器人通过KRC CONFIGURATEOR设置存储路径
  10. 华为java开发面试难不难,秀出天际!
  11. c#生成静态库_在 Blazor WebAssembly 静态网站中部署ML.NET机器学习模型
  12. 17.Linux/Unix 系统编程手册(上) -- 访问控制列表
  13. OFFICE技术讲座:JDK绘制旋转斜体字体的效果
  14. 红旗6.0 sp2 永中office2009不能启动的原因
  15. 计算机丢失MSVCR100.dll文件的解决办法
  16. WebIM 聊天 Demo
  17. 理解服务器证书 CASSL
  18. BasicDBObject 和Query 查询mongodb不同使用方式
  19. 车载平板android 002,用平板代替车载大屏,行得通吗?
  20. CF1151F Sonya and Informatics

热门文章

  1. 安徽c语言二级真题,安徽省计算机等级二级考试真题C语言
  2. 每次合上笔记本总是进入待机或休眠
  3. element-ui的输入框只能输入数字
  4. MATLAB函数var、std浅析
  5. 整车研发项目阶段归纳
  6. Windows11清理C盘空间优化
  7. 【SoapUI】SoapUI工具简介及安装
  8. CUMT-CTF第一次双月赛Writeup
  9. 最新UI界面很简洁的方盒子iApp源码+适合做工具箱
  10. C#游戏编程之创建一个简单的卷轴射击游戏