java 运算符总面试题总结

题目:请写出下面几个表达式的结果,答案可以用10进制或16进制书写

1. 0xaa | 0x55

2. 15 & 240

3. 10 ^ 12

4. -2 >> 1

5. -2 >>> 1


解答:

1. 分析:十六进制数用0x……来表示,后面一个十六进制位是四位,两个十六进制位为一个字节,最多后面可以有8个十六进制位,32个字节,如:0xFFFFFFFF。 或(“ | ”)运算,全0为0,其他为1。

     所以:0xaa 用二进制表示为 10101010 ,0x55 用二进制表示为 01010101 ,按位或之后为 11111111 ,十进制数为255,十六进制数为 0xFF 。


2. 分析:10进制转换成2进制,用该数字除以2,记录商和余数,利用商再次除以2,记录商和余数……直到上为0或余数为0停止,余数逆序组成二进制的从低到高位(最后的余数为二进制最低位)。与(“ & ”)运算,全1为1,其他为0 。               

     所以: 15 等于1111 ,240等于 11110000,15前面用0补齐为00001111 ,按位与之后为 00000000 ,即结果为0


3. 分析: 亦或(“ ^ ”)运算,相同取0,不同取1 。

     所以:1010 ^ 1100 =0110 , 十进制表示为6,十六进制表示为 0x06 。


4. 分析: 带符号右移(“ >> ”),即有符号位时,负数符号位补1,正数符号位补0, -2 的二进制求法是正数取反加1,因此 2 的二进制表示为0000 0000 0000 0000 0000 0000 0000 0010 ,取反加一为 

                      1111 1111 1111 1111 1111 1111 1111 1110 ,即 -2 的二进制表示。

        注: >> , <<  , >>> ,  运算符只针对int型和long型,byte ,short ,char型需要转换成Int型在进行操作。

    所以: 带符号右移之后为 1111 1111 1111 1111 1111 1111 1111 1111 ,除符号位之外,减一取反,得到带符号十进                 制数为 -1 。


5. 分析:无符号右移 (“ >>> ”) ,即无论正负数,右移之后符号位均补 0 。

    所以: -2 的二进制无符号右移一位之后为 0111 1111 1111 1111 1111 1111 1111 1111,即 2^31 - 1,二的三十一次方减一。

        :右移和无符号右移主要区别就在于左面最高位补 0 还是补 1 的问题,无符号右移任何时候最高位都补 0 ,                  有符号右移则是正数补 0 ,负数补 1 。(没有无符号左移!)


               

你可能感兴趣的:(Java)