java 位运算

一、基础知识

1.要了解java中的位运算,要先看看每种类型占多少位,见下图

 2.要知道10进制的数字怎么转为2进制的010101组合的,只需要知道为1的位序号即可。从高位往低位去寻找。

已知整数a,如果2**n<a,并且2**n * 2>a,那么最高位就是n(从第0位开始计数),然后将a-2**n的余数进行同样的运算,一直到最后剩1或者0(不是奇数就是偶数),是1的话说明第0位是1,是0的话说明第0位是0.

例子:99=1*2**6 + 1*2**5 + 1*2**1 + 1* 2**0,故可以得到99数字用二进制表示,第0,1,5,6位是1,其他是0

用java写方法计算

	public static int getBitNum(int num){
		  if(num == 0){
            return -1;
           }
        if(num == 1){
			System.out.println("为1的位置有:  "+0);
            return 0;
          }
		//根据对数换底公式 logx(y) =loge(y) / loge(x)可推出
        int bNum= (int) (Math.log(num)/Math.log(2));
        System.out.println("为1的位置有:  "+bNum);
        getBitNum((int) (num%(Math.pow(2,bNum))));
        return bNum;
	}

 3.还需要知道运算符的优先级可以看到移位运算符在算数运算符(* /  + -)之后

优先级运算符分类结合顺序运算符

分隔符左结合.    []     ( )     ;      ,
一元运算符右结合!  ++     --     -   ~

算术运算符

移位运算符

左结合*     /      %    +     -      <<   >>   >>>
关系运算符左结合<     >     <=   >=   instanceof(Java 特有)   = =  !=
逻辑运算符左结合! &&  ||  ~  &  |  ^ 
三目运算符右结合布尔表达式?表达式1:表达式2
赋值运算符右结合=  *=     /=  %=   +=   -=    <<= >>= >>>=  &=  *=  |=

 二、位运算

1.位运算按照优先级排列如下

非(~)——> 左移(<<),右移(>>和>>>)  ——> 与(&) ——> 异或(^) ——> 或(|)

2.位运算

注意:

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

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

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

a.非(~)运算

各位上的值1变0,0变1,

例1:10进制数字99 ,非(~)运算后为100,如下图,计算,高位1为负,则有 ~99=-1*2**7 + 1*2**4 + 1*2**3 + 1*2**2=-100;

例2:10进制数-20 ,通过1变0,0变1得到,~-20=1*2**4 + 1*2**1 + 1*2**0=19;

 由以上两个例子看出,~99=-99 - 1;~-20 = -(-20)-1,可以得到,对数a取反,-a = (~a)+1;

b.左移(<<)

在当前类型的数值范围内,没往左移动1位,得到的数值翻倍,移动n位,得到为a*2**n

c.右移(>>)

如下图,99>>1=49,99>>3=12,可以得到:数啊a右移n位,等于(int)(a/2**n)


 

d.无符号右移(>>>)

无符号右移是不管正负数都在高位补0,如果是正数,那么规则和带符号右移(>>)相同,如果是负数,来看一下下图,

e.与运算(&) 

相应的位置上都是1,结果才是1,否则为0,即1&0=0;0&1=0,;0&0=0;1&1=1.。

例子:判断数字的奇偶性,a&1=1,则a为奇数;a&1=0,则a为偶数

 

f.或运算(|)

两数进行或(|)运算,相应的位置有一个数字的值是1,则是1,否则是0,即1 | 1 = 1,1 | 0 = 1  ,0 | 1 = 1,0 | 0 = 0 ;

例子:可能在物联网等数据传输后接收方需要按某种规则操作后才能解析,如将接收到的数字a的第n位变成1,那么可以如下:

b = a | (1 << n);(将a数字的第n位变成1)。

g.异或运算(^)

相应位相同为0,不同为1,即 0 ^ 0 = 0, 1 ^ 1 = 0; 0 ^ 1 = 1, 1 ^ 0 = 1;

例子1:0异或任何数值为任何数,a ^ 0 = a;

 例子2:不用第三个变量交换两个变量x,y的值,

  x ^= y; y ^= x;  x ^= y; 如下图,3种颜色分别代表三次异或(^)运算的过程

ok,今天的分享就到这里,如有不对之处欢迎指正!

 

  • 8
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值