zoukankan      html  css  js  c++  java
  • Java编程(位运算符)

    二进制运算符
      由于计算机内部的数据都以二进制的形式存在,所以在Java语言中提供了直接操作二进制的运算符,这就是下面要讲解的位运算符和移位运算符。
      使用二进制的运算符,可以直接在二进制的基础上对数字进行操作,执行的效率比一般的数学运算符高的多,该类运算符大量适用于网络编程、硬件编程等领域。
      二进制运算符在数学上的意义比较有限。
      在Java代码中,直接书写和输出的数值默认是十进制,Java代码中无法直接书写二进制数值,但是可以书写八进制和十六进制数字,八进制以数字0开头,例如016,十六进制以数字0和x开头,例如0x12,0xaf等等。
      在计算二进制运算时,Java语言的执行环境(JRE)首先将十进制的数字转换为二进制,然后进行运算。如果输出结果的值,则数字会被转换成十六进制进行输出。
      需要注意的是:
      1、正数的机器数是原码,负数的机器数是补码,计算时需要小心。关于二进制和补码的计算可以参看《Java编程那些事儿7——进制的概念》和《Java编程那些事儿8——计算机内部的数据表达》。
      2、整数型的计算结果都是int型,而不管是对byte还是short进行二进制运算。
      位运算符
      Java语言中的位运算符主要有4种:&(位与)、|(位或)、^(异或)和~(按位取反),下面依次介绍运算规则和使用示例。
      l &(AND)
      运算规则:参与运算的数字,低位对齐,高位不足的补零,对应的二进制位都为1,则运算结果为1,否则为0.适用场合:屏蔽数字中某一位或某些位。因为任何数和0与都是0.示例代码:
      int a = 4;
      int b = 10;
      int c = a & b;
      计算过程:
      4的二进制形式为0000 0000 0000 0000 0000 0000 0000 0100
      10的二进制形式为0000 0000 0000 0000 0000 0000 0000 1010
      按照计算规则,结果为0000 0000 0000 0000 0000 0000 0000 0000
      这个数字转换为十进制就是数字0 l | (OR)
      运算规则:参与运算的数字,低位对齐,高位不足的补零,对应的二进制位有一个为1则为1,否则为0.适用场合:将数字中某一位或某些位修改成1.因为1和任何数或都是1.示例代码:
      int a = 4;
      int b = -10;
      int c = a | b;
      计算过程:
      4的二进制形式为0000 0000 0000 0000 0000 0000 0000 0100
      10的二进制形式为1111 1111 1111 1111 1111 1111 1111 0110
      Examda提示: 按照计算规则,结果为1111 1111 1111 1111 1111 1111 1111 0110
      这个二进制数转换为十进制就是数字-10. l ^(XOR)
      运算规则:参与运算的数字,低位对齐,高位不足的补零,对应的二进制位相同为零,不相同为1.适用场合:判断数字对应的位是否相同。
      示例代码:
      int a = 4;
      int b = 10;
      int c = a ^ b;
      计算过程:
      4的二进制形式为0000 0000 0000 0000 0000 0000 0000 0100
      10的二进制形式为0000 0000 0000 0000 0000 0000 0000 1010
      按照计算规则,结果为0000 0000 0000 0000 0000 0000 0000 1110
      这个数字转换为十进制就是数字14 l ~(NOT)
      运算规则:只操作一个数字,将该数字中为1的位变成0,为0的位变成1.适用场合:反转数字的内容示例代码:
      int a = 4;
      int c = ~a;
      计算过程:
      4的二进制形式为0000 0000 0000 0000 0000 0000 0000 0100
      按照计算规则,结果为1111 1111 1111 1111 1111 1111 1111 1011
      这个数字转换为十进制就是数字-5.其实位运算和实际的应该实现保持一致,也就是提供的电路级运算符号,每种运算符都有对应的电路实现。
      实际使用简单示例:
      把任意数字转换为正数
      假设n是一个任意的整数,则把n转换为正数的代码为:
      int m = n & 0x7fffffff;
      判断任意数字倒数第三位的值是否为1假设n是一个任意的整数,则判断的代码为:
      int m = n & 0x4;
      boolean b = (m != 0);
      将任意数字倒数第四位置为
      假设n是一个任意的整数,则代码为:
      int m = n | 0x8;

    在Thinking   in   Java第三章中的一段话:

    移位运算符面向的运算对象也是二进制的“位”。可单独用它们处理整数类型(主类型的一种)。左移位运算符( < <)能将运算符左边的运算对象向左移动运算符右侧指定的位数(在低位补0)。“有符号”右移位运算符(> > )则将运算符左边的运算对象向右移动运算符右侧指定的位数。“有符号”右移位运算符使用了“符号扩展”:若值为正,则在高位插入0;若值为负,则在高位插入1。Java也添加了一种“无符号”右移位运算符(> > > ),它使用了“零扩展”:无论正负,都在高位插入0。这一运算符是C或C++没有的。
    若对char,byte或者short进行移位处理,那么在移位进行之前,它们会自动转换成一个int。只有右侧的5个低位才会用到。这样可防止我们在一个int数里移动不切实际的位数。若对一个long值进行处理,最后得到的结果也是long。此时只会用到右侧的6个低位,防止移动超过long值里现成的位数。但在进行“无符号”右移位时,也可能遇到一个问题。若对byte或short值进行右移位运算,得到的可能不是正确的结果(Java   1.0和Java   1.1特别突出)。它们会自动转换成int类型,并进行右移位。但“零扩展”不会发生,所以在那些情况下会得到-1的结果。

     

    作者:张锋
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须在文章页面给出原文连接,否则保留追究法律责任的权利。
    更多精彩文章可以观注
    微信公众号 soft张三丰

    微信交流群,添加群主微信,邀请入群
  • 相关阅读:
    Java实现 LeetCode 50 Pow(x,n)
    Java实现 LeetCode 50 Pow(x,n)
    Java实现 LeetCode 49 字母异位词分组
    Java实现 LeetCode 49 字母异位词分组
    Java实现 LeetCode 49 字母异位词分组
    Java实现 LeetCode 48 旋转图像
    Java实现 LeetCode 48 旋转图像
    Java实现 LeetCode 48 旋转图像
    Java实现 LeetCode 47 全排列 II(二)
    Java实现 LeetCode 47 全排列 II(二)
  • 原文地址:https://www.cnblogs.com/skyme/p/2014078.html
Copyright © 2011-2022 走看看