Java基础面试题------逻辑运算符、位移操作使用介绍

一、前言:

       最近在看ConcurrentHashMap底层源码的时候,发现太多的^|&等相关运算,刚好写个帖子,供初学者学习借鉴。

二、ConcurrentHashMap 底层散列方法源码:

    
   //入参为存入对象的hashcode
   static final int spread(int h) {
        return (h ^ (h >>> 16)) & 0x7fffffff;
    }

知识点:

 1、0x7fffffff  是啥??

       知识点:

       首先在java语言中,有八种基本数据类型,int默认有符号,占用4个字节(一个字节8位),用二级制表示有32位,第一位表示符号1表示负数,0表示正数。

       所以针对有符号的整型取值范围是- 2的31次方~2的31次方-1     

      陷阱:

           A、不是2的32次方,老铁们注意了。面试时偶尔会设置陷阱,我曾经挖过,很多面试者挑战失败。

           B、64位机器,int的取值范围是多少,很多人义无反顾的表示-2的63位到2的63次方-1,其实在Java,不管是32位系统还是64位系统,int都是占用4个字节。

        其次针对无符号的整型unsigned int,占用4个字节(32位),它可以表示的整型取值范围是0~2的32次方-1

         最后回到正题,0x7fffffff  是int能表示的最大值

 2、^  &  <<   >>  >>>运算符使用:

  1)^运算符使用:

       ^表示异或运算  1^0 =1   0^1=1 1^1=0 0^0=0;

  2)&运算符使用:

       &表示与运算   1&1=1 1&0=0 0&0=0

  3) <<  >>运算符使用:

         <<表示左移   2<<1      0010  左移1位  高位移除一位,地位补0      0100  

         >>表示右移    2>>1     0010   右移1位  低位移除一位,高位补0      0001

       例如: >>:右移运算符,num >> 1,相当于num除以2。

       按二进制形式把所bai有的数字向右移动du对应位数,低位移出(舍弃),高位的zhi空位补符号位,即正数补零,负数补1。符号位不变。

如:-1在32位二进制中表示为:11111111 11111111 11111111 11111111,-1>>1:按位右移,符号位不变,仍旧得到11111111 11111111 11111111 11111111,因此值仍为-1

   4)<<<   >>>运算符使用:

        <<<表示无符号左移  >>>表示无符号右移

       例如:>>>:二进制右移补零操作符,左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充,如value >>> num中,num指定要移位值value 移动的位数。

System.out.println(-1>>>31);
System.out.println(-1>>31);

运行结果:
1=====》以无符号位右移
-1====》符号位不变

 三、其他知识点:

Java基础面试题------逻辑运算符、位移操作使用介绍_第1张图片

运算符之间,按优先级顺序排列为:

1:~;

2:<<、>>;

3:&;

4:^;

5:|;

6:&=、^=、|=、<<=、>>=。

你可能感兴趣的:(Java基础知识收集分享)