zoukankan      html  css  js  c++  java
  • java 位运算

    & 与 同为1,则为1,否则为0;

    | 或 其中一个为1,则为1,否则为0;

    ^ 异或 相同为0,不同为1;

    ~ 非,为1则0,为0则1;

    >>1 向右位移1,若正数,高位补0,负数,高位补1;

    正数到负数 

    4 :0100 求补 1011 加1 1100 ;

    <<1 向左位移1,若正数,高位补0,负数,高位补1;

    无符号右移>>>(不论正负,高位均补0);

    由于数据类型所占字节是有限的,而位移的大小却可以任意大小,所以可能存在位移后超过了该数据类型的表示范围,于是有了这样的规定:
    如果为int数据类型,且位移位数大于32位,则首先把位移位数对32取模,不然位移超过总位数没意义的。所以4>>32与4>>0是等价的。

    如果为long类型,且位移位数大于64位,则首先把位移位数对64取模,若没超过64位则不用对位数取模。

    如果为byte、char、short,则会首先将他们扩充到32位,然后的规则就按照int类型来处理。

    1.  判断int型变量a是奇数还是偶数    
         a&1  = 0 偶数 
         a&1 =  1 奇数 
    2.  求平均值,比如有两个int类型变量x、y,首先要求x+y的和,再除以2,但是有可能x+y的结果会超过int的最大表示范围,所以位运算就派上用场啦。
          (x&y)+((x^y)>>1); 
    3.  对于一个大于0的整数,判断它是不是2的几次方
        ((x&(x-1))==0)&&(x!=0); 
    4.  比如有两个int类型变量x、y,要求两者数字交换,位运算的实现方法:性能绝对高效
        x ^= y; 
        y ^= x; 
        x ^= y; 
    5. 求绝对值
        int abs( int x ) 
       { 
         int y ; 
         y = x >> 31 ; 
        return (x^y)-y ;        //or: (x+y)^y 
       }
    6.  取模运算,采用位运算实现:
         a % (2^n) 等价于 a & (2^n - 1) 
    7.  乘法运算   采用位运算实现
         a * (2^n) 等价于 a << n
    8.   除法运算转化成位运算
          a / (2^n) 等价于 a>> n 
    9.   求相反数
          (~x+1) 
    10  a % 2 等价于 a & 1 

  • 相关阅读:
    gojs入门
    chartjs:改变图表的外观
    chart.js入门
    verilog与C语言的6点重大区别
    PCB布线原则【转】_神经火光_百度空间
    verilog中对同一个变量有判断条件的赋值
    同步复位与异步复位——异步复位同步释放
    如何利用TCL文件给FPGA分配引脚
    0欧姆电阻的作用
    独热码
  • 原文地址:https://www.cnblogs.com/jinjixia/p/5318982.html
Copyright © 2011-2022 走看看