Java学习者论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

恭喜Java学习者论坛(https://www.javaxxz.com)已经为数万Java学习者服务超过8年了!积累会员资料超过10000G+
成为本站VIP会员,下载本站10000G+会员资源,购买链接:点击进入购买VIP会员
JAVA高级面试进阶视频教程Java架构师系统进阶VIP课程

分布式高可用全栈开发微服务教程

Go语言视频零基础入门到精通

Java架构师3期(课件+源码)

Java开发全终端实战租房项目视频教程

SpringBoot2.X入门到高级使用教程

大数据培训第六期全套视频教程

深度学习(CNN RNN GAN)算法原理

Java亿级流量电商系统视频教程

互联网架构师视频教程

年薪50万Spark2.0从入门到精通

年薪50万!人工智能学习路线教程

年薪50万!大数据从入门到精通学习路线年薪50万!机器学习入门到精通视频教程
仿小米商城类app和小程序视频教程深度学习数据分析基础到实战最新黑马javaEE2.1就业课程从 0到JVM实战高手教程 MySQL入门到精通教程
查看: 495|回复: 0

[Java基础知识]20个位运算技巧

[复制链接]
  • TA的每日心情
    开心
    2021-3-12 23:18
  • 签到天数: 2 天

    [LV.1]初来乍到

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

         
       
         
         
         
       
         
         
       
         
         
       
         
         
        1.获得int型最大值  
         
         
          
          
           [cpp]
          
          
          
          int  getMaxInt(){   
                  return  (1<<31) - 1; //2147483647, 由于优先级关系,括号不可省略     
          }   
          
         
        另一种写法  
       
          
          
          
          
            [cpp]
            
          
          
           int  getMaxInt(){   
               return  -(1<<-1) - 1; //2147483647     
           }   
          
          
         另一种写法  
          
          
            
            
             [cpp]
             
             
            
            
            int  getMaxInt(){   
                return  ~(1<<31); //2147483647     
            }   
            
          
          
         C语言中不知道int占几个字节时候  
          
          
            
            
             [java]
             
             
            
            
            int  getMaxInt(){   
                return  ((unsigned  int )- 1 ) >>  1 ; //2147483647     
            }   
            
          
          
         2.获得int型最小值  
          
          
          
            [cpp]
            
          
          
           int  getMinInt(){   
               return  1<<31; //-2147483648     
            }   
          
          
         另一种写法  
         
       
          
          
          
          
            [cpp]
            
          
          
           int  getMinInt(){   
               return  1 << -1; //-2147483648     
           }   
          
          
         3.获得long类型的最大值  
         
        C语言版  
       
          
          
          
          
            [cpp]
            
            
          
          
           long  getMaxLong(){   
               return  ((unsigned  long )-1) >> 1; //2147483647     
           }   
          
          
         JAVA版  
         
       
          
          
          
          
            [java]
            
            
          
          
           long  getMaxLong(){   
               return  (( long ) 1 << 127 )- 1 ; //9223372036854775807     
           }   
          
          
         获得long最小值,和其他类型的最大值,最小值同理.
         
       
         

         
        4.乘以2运算  
       
          
          
          
          
            [cpp]
            
          
          
           int  mulTwo( int  n){ //计算n*2      
               return  n<<1;   
           }   
          
          
         5.除以2运算  
          
          
          
            [cpp]
            
          
          
           int  divTwo( int  n){ //负奇数的运算不可用     
               return  n>>1; //除以2     
           }   
          
          
         6.乘以2的m次方  
         
       
          
          
          
          
            [cpp]
            
          
          
           int  mulTwoPower( int  n, int  m){ //计算n*(2^m)     
               return  n<<m;   
           }   
          
          
         7.除以2的m次方  
         
       
          
          
          
          
            [cpp]
            
          
          
           int  divTwoPower( int  n, int  m){ //计算n/(2^m)     
               return  n>>m;   
           }   
          
          
         8.判断一个数的奇偶性  
          
          
          
            [java]
            
          
          
           boolean  isOddNumber( int  n){   
               return  (n &  1 ) ==  1 ;   
           }   
          
          
         
        9.不用临时变量交换两个数(面试常考)  
        C语言 版  
       
          
          
          
          
            [cpp]
            
          
          
           void  swap( int  *a, int  *b){      
               (*a)^=(*b)^=(*a)^=(*b);   
           }   
          
          
         通用版(一些语言中得分开写)  
          
          
          
            [java]
            
          
          
           a ^= b;   
           b ^= a;   
           a ^= b;   
          
          
         1 0.取绝对值(某些机器上 , 效率比n>0  ?  n:-n 高)  
         
       
          
          
          
          
            [cpp]
            
          
          
           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高)  
         通用版  
          
          
            
            
             [cpp]
             
            
            
            int  max( int  a, int  b){   
                return  b&((a-b)>>31) | a&(~(a-b)>>31);   
                /*如果a>=b,(a-b)>>31为0,否则为-1*/     
            }   
            
          
          C语言版  
          
            
             
             
              [cpp]
              view plain
              copy
             
             
             
             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高)  
          
         通用版  
          
          
            
            
             [cpp]
             
            
            
            int  min( int  a, int  b){   
                return  a&((a-b)>>31) | b&(~(a-b)>>31);   
                /*如果a>=b,(a-b)>>31为0,否则为-1*/     
            }   
            
          
          
         C语言版  
          
          
            
            
             [cpp]
             
            
            
            int  min( int  x, int  y){   
                return  y ^ ((x ^ y) & -(x < y));   
                     /*如果x<y x<y返回1,否则返回0,   
                        与0做与运算结果为0,与-1做与运算结果不变*/     
            }   
            
          
          13.判断符号是否相同  
          
         
       
          
          
          
          
            [java]
            
            
          
          
           boolean  isSameSign( int  x,  int  y){   
               return  (x ^ y) >  0 ;  // true 表示 x和y有相同的符号, false表示x,y有相反的符号。     
           }   
          
          
         
        14.计算2的n次方  
       
          
          
          
          
            [cpp]
            
          
          
           int  getFactorialofTwo( int  n){ //n > 0     
               return  2<<(n-1); //2的n次方     
           }   
          
          
         15.判断一个数是不是2的幂  
         
          
          
            
            
             [java]
             
            
            
            boolean  isFactorialofTwo( int  n){   
                return  (n & (n -  1 )) ==  0 ;   
                /*如果是2的幂,n一定是100... n-1就是1111....   
                   所以做与运算结果为0*/     
            }   
            
          
          16.对2的n次方取余  
          
         
          
          
            
            
             [java]
             view plain
             copy
             
            
            
            int  quyu( int  m, int  n){ //n为2的次方     
                return  m & (n -  1 );   
                /*如果是2的幂,n一定是100... n-1就是1111....   
                 所以做与运算结果保留m在n范围的非0的位*/     
            }   
            
          
          17.求两个整数的平均值  
          
            
            
             [java]
             
            
            
            int  getAverage( int  x,  int  y){   
                    return  (x+y) >>  1 ;     
            }   
            
          
          另一种写法  
          
          
          
            
            
             [java]
             
            
            
            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位  
          
            
             
             
              [java]
             
             
             
             int  getBit( int  n,  int  m){   
                 return  (n >> (m- 1 )) &  1 ;   
             }   
             
            
           19.从低位到高位.将n的第m位置1  
          
          
            
             
             
              [java]
              view plain
              copy
             
             
             
             int  setBitToOne( int  n,  int  m){   
                 return  n | ( 1 <<(m- 1 ));   
                 /*将1左移m-1位找到第m位,得到000...1...000   
                   n在和这个数做或运算*/     
             }   
             
            
          
          20.从低位到高位,将n的第m位置0  
          
            
             
             
              [java]
             
             
             
             int  setBitToZero( int  n,  int  m){   
                 return  n & ~( 1 <<(m- 1 ));   
                 /* 将1左移m-1位找到第m位,取反后变成111...0...1111   
                    n再和这个数做与运算*/     
             }
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|手机版|Java学习者论坛 ( 声明:本站资料整理自互联网,用于Java学习者交流学习使用,对资料版权不负任何法律责任,若有侵权请及时联系客服屏蔽删除 )

    GMT+8, 2024-5-20 17:44 , Processed in 0.369035 second(s), 48 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表