`
aokunsang
  • 浏览: 817948 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

传说中的Java基础东西(按位操作运算)

    博客分类:
  • Java
阅读更多

前奏:

   昨天一哥们问我Java位移你会吗,我说不会,想想位移这么麻烦,一般有位移的Java代码一律不看,有几个人会啊,是吧?但是那哥们的回答,让我郁闷半天:“这都不会啊,都是Java基础的东西呀!”我靠,我晕倒,听着老不爽了,so我决定对位移一探究竟,原来也这么随意啊,哈哈。因此,把心得总结如下,欢迎收看。

在这里先感谢一下,JavaEye上的高手们的技术博客指点。TKS very much。

技术总结:

<1>.在了解位移之前,先了解一下正数和负数的二进制表示形式以及关系:
举例15和-15:

15的原码: 00000000 00000000 00000000 00001111
    补码: 11111111 11111111 11111111 11110000
                 +1 =
-15的原码:11111111 11111111 11111111 11110001

负数的原码即为:正数的原码取反,再加1。

<2>位移操作:(只针对int类型的数据有效,java中,一个int的长度始终是32位,也就是4个字节,它操作的都是该整数的二进制数).也可以作用于以下类型,即byte,short,char,long(当然,它们都是整数形式)。当为这四种类型是,JVM先把它们转换成int型再进行操作。

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

<<和>>为数值位移,>>>为逻辑位移。【注】:Java中不存在<<<。

$1> m<<n的含义:把整数m表示的二进制数左移n位,高位移出n位都舍弃,低位补0.  (此时将会出现正数变成负数的形式)
实例:
  3<<2剖析:
  3二进制形式: 00000000 00000000 00000000 00000011,按照$1的原理,得到00000000 00000000 00000000 00001100,即为12.
 
  左移使整数变为负数:
  10737418<<8
  10737418二进制表示形式:00000000 10100011 11010111 00001010,按照$1的原理,得到10100011 11010111 00001010 00000000,即为:-1546188288.

$2> m>>n的含义:把整数m表示的二进制数右移n位,m为正数,高位全部补0;m为负数,高位全部补1.
实例:
  3>>2剖析:
  3二进制形式: 00000000 00000000 00000000 00000011,按照$2的原理,得到00000000 00000000 00000000 00000000,即为0.
  -3>>2剖析:
  -3二进制形式: 11111111 11111111 11111111 11111101,按照$2的原理,得到11111111 11111111 11111111 11111111,即为-1.

以上:每个整数表示的二进制都是32位的,如果右移32位和右移0位的效果是一样的。依次类推,右移32的倍数位都一样。

$3> m>>>n:整数m表示的二进制右移n位,不论正负数,高位都补零。
实例:
  3>>>2剖析:
  3二进制形式: 00000000 00000000 00000000 00000011,按照$3的原理,得到00000000 00000000 00000000 00000000,即为0.
  -3>>>2剖析:
  -3二进制形式: 11111111 11111111 11111111 11111101,按照$3的原理,得到00111111 11111111 11111111 11111111,即为1073741823.
  

【注】:对于$1,$2,$3,如果n为负数:这时JVM会先让n对32取模,变成一个绝对值小于32的负数,然后再加上32,直到 n 变成一个正数。
实例:
   4<<-10
   4的二进制形式:00000000 00000000 00000000 00000100,-10对32取模再加上32,不用说了,得到22,则4<<-10,即相当于4<<22。
   此时按照再按照$1原理,得到00000001 00000000 00000000 00000000,得到的即为:16777216。

OK,大功告成。

综上所述:
   m<<n即在数字没有溢出的前提下,对于正数和负数,左移n位都相当于m乘以2的n次方.
   m>>n即相当于m除以2的n次方,得到的为整数时,即为结果。如果结果为小数,此时会出现两种情况:(1)如果m为正数,得到的商会无条件的舍弃小数位;(2)如果m为负数,舍弃小数部分,然后把整数部分加+1得到位移后的值。


---------------------------------------------------------------------------------


接下来在此说说位操作的好处,速度超快,这些都是底层的二进制机器操作指令。
  比如:a*2,

       1.jvm先为变量a分配空间;

       2.再进行a*2的操作;

      3.再把结果返回给相应的变量。
而a<<1,和a*2一样,它只需要一条指令即可,速度很快。当然前三种位移操作都是对2的倍数

进行操作时可用。



再进行些许补充,谈到位操作,当然还要说到四个操作符:~(按位非),|(按位或),&(按位

与),^(按位异或),这些都是大学计算机基础用法,对整数的二进制形式进行操作,然后再

转换为整数,具体操作如下。
1.~(按位非):【解义】对该整数的二进制形式逐位取反。
    ~4:(一元操作符)
     4的二进制形式为:00000000 00000000 00000000 00000100,逐位取反后得

到:11111111 11111111 11111111 11111011,即为-5.
2.|(按位或):【解义】对两个整数的二进制形式逐位进行逻辑或运算,原理为:1|0=1,0|0=0,1|1=1,0|1=1
等。
    4|-5:
     4的二进制形式为:00000000 00000000 00000000 00000100,
    -5的二进制形式为:11111111 11111111 11111111 11111011,
  逐位进行逻辑或运算:11111111 11111111 11111111 11111111,即得到-1.
3.&(按位与):【解义】对两个整数的二进制形式逐位进行逻辑与运算,原理:1|0=0,0|0=0,1&1=1;0&1=0等。 
   4&-5:
     4的二进制形式为:00000000 00000000 00000000 00000100,
    -5的二进制形式为:11111111 11111111 11111111 11111011,
  逐位进行逻辑与运算:00000000 00000000 00000000 00000000,即得到0.  

实际应用:可以把字节转换为整数,-64&0xFF=192,也可以用八进制的形式,-64&0377=192、

其实0xFF和0377都表示的是整数255、
4.^(按位异或):【解义】对两个整数的二进制形式逐位进行逻辑异或运算,原理:1^1=0,1^0=1,0^1=1,0^0=0.
   4^-5:
     4的二进制形式为:00000000 00000000 00000000 00000100,
    -5的二进制形式为:11111111 11111111 11111111 11111011,
逐位进行逻辑异或运算:11111111 11111111 11111111 11111111,即得到-1.

实际应用:按位异或可以比较两个数字是否相等,它利用1^1=0,0^0=0的原理。  20^20==0

 

分享到:
评论

相关推荐

    JAVA基础知识及问答

    在Java编程中,掌握基础至关重要,特别是对于初学者。以下是关于Java基础知识的详细解释: 1. **异常处理机制**:Java的异常处理机制是通过`try-catch-finally`块实现的。当程序违反了Java的语义规则,如数组越界或...

    Josephus.java,是java课程的实验2 求解约瑟夫环问题.zip

    在实际编程中,可以考虑优化算法,例如使用位运算来提高计算效率。此外,还可以通过多线程或者并发处理来模拟更复杂的情况,比如有多个环同时进行淘汰。 总的来说,解决约瑟夫环问题不仅可以锻炼我们的编程能力,还...

    Java经典入门教程pdf完整版

    4:除了上面提到的,Java还有很多功能:如进行数学运算、显示图形界面、进行网络操作、 进行数据库操作、进行文件的操作等等。 PDF文件使用&quot; pdfFactory Pro&quot;试用版本创建ww, fineprint,cn Java私塾跟我学...

    约瑟夫问题的源代码实现

    在位运算法中,可以使用一个整数变量来表示当前存活的士兵,通过位运算进行淘汰,最后保留下来的位即为幸存士兵的编号。 无论是链表法还是位运算法,都需要考虑边界条件,比如当k为1时,问题会变成每个士兵都会被...

    数据结构课程设计--敢死队问题

    4. **位运算法**:利用位操作可以高效地进行移位和按位与运算。将每个人的编号转化为二进制,通过位运算模拟报数和剔除过程。这种方法在大数据量时效率极高,但实现起来相对复杂,需要对位运算有深入理解。 在进行...

    迅腾国际C语言教程大全,超经典

    10. **进阶话题**:如位运算、多文件项目管理、递归、动态数据结构等,这些都是C语言高级主题,对于提升编程能力大有裨益。 总的来说,《迅腾国际C语言教程大全》是一份全面而实用的学习资料,无论你是编程新手还是...

    约瑟夫问题

    约瑟夫问题的解决方案通常涉及到数学和计算机科学中的数据结构,如链表、数组以及位运算。一种常见的解法是使用模运算和数组来模拟环形结构,通过一个计数器来跟踪当前报数,当计数器达到M时,就淘汰对应位置的人,...

    wheat-international-chess-.rar_chess_site:www.pudn.com

    对于编程初学者来说,这个项目可以帮助理解指数增长的概念,学习如何处理大数值,以及掌握编程语言中的循环、数组操作和数学运算。同时,这也是一个很好的实践机会,可以锻炼他们解决问题和编写代码的能力。 标签...

    算法大全(C语言版本)很经典

    - **背景**: 故事讲述了一个古老传说中的僧侣们需要将64个金盘从一根柱子移动到另一根柱子上,但必须遵循大盘不能放在小盘上面的原则。 - **目标**: 移动所有盘子,且始终遵循大盘在小盘之下这一规则。 - **应用场景...

Global site tag (gtag.js) - Google Analytics