精华内容
下载资源
问答
  • 要讲java一些奇奇怪怪的运算符号之前,必须先了解二进制,因为这些看不懂的运算符都是基于二进制运算的 计算机里二进制的运算,往往比十进制运算来的快。 首先了解下转换规则(相互转换): 转码之前,有一些名词...

    要讲java一些奇奇怪怪的运算符号之前,必须先了解二进制,因为这些看不懂的运算符都是基于二进制运算的

    计算机里二进制的运算,往往比十进制运算来的快。
    首先了解下转换规则(相互转换):

    转码之前,有一些名词概念:

    1、原码
    一个正数,按照绝对值大小转换成二进制数,称为原码
    2、反码
    将二进制数按位取反,所得的新二进制数称为原二进制数的反码
    其实就是把原码中的0变为1,1变为0
    例如:0000 0101 和1111 1010就是互为反码
    3、补码
    在反码的基础上加1称为补码,一般在算负数的时候会用到

    十进制转二进制:

    1、正整数转换二进制


    2、负整数转换二进制


    3、小数转换二进制


    重点掌握前面两个:
    1、正整数转换二进制
    除二取余,然后倒序排列,高位补零。

    如下图:三步操作(字丑勿喷)

    2、负整数转换二进制
      先将对应的正整数转换成二进制
      对二进制取反,这边有个不一样的地方,原来那个正数的补位都是0,但是你取反了,那就证明负数补位的时候,要补1
      然后对结果再加1(这里的1,是十进制的1,但是十进制的1对应的二进制就是00000001)

      如下图:

    3、小数转化二进制
      先对小数部分*2,乘到小数部分为0
      然后再对整数部分计算

      最后合起来
      如下图:
      

    二进制转十进制:

    这里会有两种情况,有符号数,和无符号数
    1、无符号数的话就是直接转换成正整数

    如下图:

    2、有符号数的话,就把第一个数字看成符号,1就是负数,0就是正数
      1)如果是正数,那就是第一位不用做计算,把后面的7位拿起来计算,
      比如0111 1111 结果就是127
      2)如果是负数,那算法就是先对结果(这个结果是补码)减1获得反码,然后取反(获得原码),然后计算,跟负十进制的数转换成二进制的数的操作是相反的
      比如1111 1111,结果就是-1
      转换过程:1111 1111 -1 = 1111 1110
    取反:1111 1110 =》 0000 0001

    转换:1*2的0次方=1,那因为我们一开始就定义它为负数,所以就是-1


    ======================================华丽的分割线============================================

    明白了上面的相互转换之后
    就开始来理解java中一些奇特的符号:

    1、&(按位与)


    2、|(按位或)


    3、^(按位异或)


    4、~ (按位取反)


    5、>> (右移运算符)


    6、<< (左移运算符)


    这些就是java中对二进制数字的计算,别的语言应该还有些其他的符号

    本人水平有限所以。。。。


    1、& 与
    规则:先将两个数字转换为二进制,然后每一位进行匹配
         只有当两个位置上都是1的时候,才会返回1
    例子:9&12
    9:1001
    12:1100
    所以结果应该是:1000=》转换为十进制:8
    这个符号也有个例子,在Hadoop的MapReduce中默认实现的HashPartitioner类中的分区方法
    public int getPartition(K2 key, V2 value, int numReduceTasks) {  
    return (key.hashCode() & Integer.MAX_VALUE) % numReduceTasks;  

    就是使用这个符号。


    2、| 或
    规则:先将两个数字转换为二进制,然后每一位进行匹配
     两个位只要有一个为1,那么结果就是1,否则就为0。
    例子:9|12
    9:1001
    12:1100

    所以结果应该是:1101=》转换为十进制:13


    3、^ 异或
    规则:先将两个数字转换为二进制,然后每一位进行匹配
    两个操作数的位,相同则结果为0,不同则结果为1。
    0 ^ 1 =1,1 ^ 1 = 0,0 ^ 0 = 0,1 ^ 0 = 1
    例子:9^12
    9:1001
    12:1100

    所以结果应该是:0101=》转换为十进制:5


    4、~ 取反
    规则:这个是对一个数字的操作
     先将这个数字转换为二进制
     然后每个位上的数字,0变成1,1变成0
    例子:~9
    9:1001
    ~9:0110
    所以结果应该是0110=》转换为十进制:6
    呵呵,你自己试试,答案是错的。。不是6,答案是-10
    为什么?
    先说一个概念int类型是4字节,1字节是8位,所以int类型有32位
    然后,9的值是1001,其实你全部写出来应该是0000 0000 000...(前面有28个0)然后1001
    所以对9取反,不能简单的写成0110,因为0110代表的是0000 0000 000...(前面有28个0)然后0110
    ~9:1111 1111 1111 1111 1111 1111 1111 0110
    接着你可以在代码中试试:
    String i = Integer.toBinaryString(-10);
    System.out.println(i);
    System.out.println(i.length());
    打印出来的就是:
    11111111111111111111111111110110
    32
    结论:所以这里就要说到,在上文中提到的二进制的有符号数和无符号数
    再重新阐述一次:简单来说,例如byte长度是8位,无符号数的情况下,1111 1111 =》255

    有符号数的情况下,因为最高位1代表负号,0代表正号,所以 0111 1111 =》127,所以1000 0000 =》-128

    所以你还记得byte类型能表示的长度是-128---127吗,就是这个原因
    那么在java中几乎所有的正数取反,会得到负数,负数取反会得到正数!
    比如1000 0001 这个二进制的有符号数,他代表的值就是-127
    所以这是取反操作的一个坑,也是不少网络给出的什么二进制转换器输入1000 0000得到的值为128的原因(因为他识别成无符号二进制数字)
    如果你还不太懂,而且又想继续了解的话:http://www.cnblogs.com/ASPNET2008/archive/2009/04/29/1446471.html

    这篇别人的文章,应该可以帮到你,作者我也不知道是谁(因为他也是转载的),如对原作者有所冒犯,实在抱歉,请给我留言,我标注作者!!


    5、>> (右移运算符)和<< (左移运算符)
    这两个东西,放在一起记录,是因为这两个操作是一样的,就是一个位移操作
    1、举例1、12>>2
    操作:
    先将12转换为二进制 ==》1100
    然后把整体向右移动两位 ==》0011
    最后转换为十进制 ==》 1*2的0次方+1*2的1次方=3
    所以答案:3
    2、举例2、12<<2
    操作:
    先将12转换为二进制 ==》1100
    然后把整体向左移动两位 ==》110000
    最后转换为十进制 ==》 1*2的4次方+1*2的5次方=48
    所以答案:3
    结论:所以也能简单的理解为>>3就是原来的数字除以2的3次方,<<3就是乘以2的3次方

    好的,本人菜鸟一只,整理就到这里,如果还有什么疑问,可以给我留言,如果有说的不对的地方,请各路大神指出!!
    展开全文
  • java位运算符详解

    千次阅读 多人点赞 2018-03-28 11:57:46
    java位运算符详讲一、位运算符分类 java位运算符主要有:按与&amp;、按或|、按非~、按异或^。 在使用时,需要将运算数都转换为二进制再进行运算,若为负数则使用补码表示。二、位运算符使用方式 1...
    java位运算符详讲
    一、位运算符分类
        java中位运算符主要有:按位与&、按位或|、按位非~、按位异或^。
     在使用时,需要将运算数都转换为二进制再进行运算,若为负数则使用补码表示。

    二、位运算符使用方式
        1、按位与&

        使用规则:全一则一,否则为零。
        eg:计算7&-5的结果
        第一步:byte中的二进制
           7的二进制
           被除数    除数    商    余数
            7         2      3      1
            3         2      1      1
            1         2      0      1
            7的二进制为:00000111
           -5的二进制
            被除数    除数    商    余数
            5         2      2      1
            2         2      1      0
            1         2      0      1
            -5的二进制为:10000101
            -5的补码为:  11111010  + 1   11111011
            00000111&11111011:
            00000111
            11111011
            00000011——>对应十进制的3

        ②、按位或|

        使用规则:全0为0,否则为1;
        eg:byte位的 2|-6
        2的二进制位:  0000 0010
        -6的二进制位:1000 0110
        -6的补码:       1111 1010
        运算结果:       1111 1010
        计算原码:       1000 0110
        相当于十进制位的:-6
       
     ③、按位非~

      使用规则:遇0则1,遇1则0;
      eg:~-6
      -6的二进制位:1000 0110
      -6的补码:       1111 1010
      计算结果:       0000 0101
      相当于十进制:5
      注意:按位非是单目运算符。
     ④、按位异或^
         使用规则:相同位0,否则为1;
      eg:2^-6
      2的二进制位:  0000 0010
      -6的二进制位:1000 0110
      -6的补码:       1111 1010
      计算结果:       1111 1000
      原码:              1000 1000
      相当于十进制位:-8;

    三、位运算的意义
        二进制运算符,包括位运算符和移位运算符,使程序员可以在二进制基础上操作数字,可以更有效的进行运算,
     并且可以以二进制的形式存储和转换数据,是实现网络协议解析以及加密等算法的基础。

       
         
    展开全文
  • Java 位运算符

    2019-06-13 19:18:56
    Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。 位运算符作用在所有的上,并且按运算。假设a = 60,b = 13;它们的二进制格式表示将如下: A ...

     

    Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。

    位运算符作用在所有的位上,并且按位运算。假设a = 60,b = 13;它们的二进制格式表示将如下:

    A = 0011 1100
    B = 0000 1101
    -----------------
    A&b = 0000 1100
    A | B = 0011 1101
    A ^ B = 0011 0001
    ~A= 1100 0011

    下表列出了位运算符的基本运算,假设整数变量A的值为60和变量B的值为13:

    操作符 描述 例子
    如果相对应位都是1,则结果为1,否则为0 (A&B),得到12,即0000 1100
    | 如果相对应位都是0,则结果为0,否则为1 (A | B)得到61,即 0011 1101
    ^ 如果相对应位值相同,则结果为0,否则为1 (A ^ B)得到49,即 0011 0001
    按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 (〜A)得到-61,即1100 0011
    <<  按位左移运算符。左操作数按位左移右操作数指定的位数。 A << 2得到240,即 1111 0000
    >>  按位右移运算符。左操作数按位右移右操作数指定的位数。 A >> 2得到15即 1111
    >>>  按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 A>>>2得到15即0000 1111
    展开全文
  • Java位运算符

    千次阅读 2018-04-13 17:31:41
    Java位运算符 左移运算符:&lt;&lt; 二进制左移多少,每左移一便乘以2(在一定范围内); 有符号右移运算符(最高为什么就用什么补,如(高位为1则用1补,为0用0补)):&gt;&gt; 二进制...

    Java位运算符

    左移运算符:<< 二进制左移多少位,每左移一位便乘以2(在一定范围内);
    有符号右移运算符(最高位为什么就用什么补,如(高位为1则用1补,为0用0补)):>> 二进制右移多少位,每左移一位便除以2(在一定范围内);
    无符号右移运算符(最高位无论为什么都用0补):>>>
    与运算符:& 相同位都为1则取1,否则取0;
    或运算符:| 相同位有一个为1则取1,都为0才取0;
    异或运算符:^ 相同则取1,不同则取0;常用:(m ^ n) ^ n = m;(m ^ n) ^ m = n;
    取反运算符:~ 相同位0取1,1取0;

    展开全文
  • Java位运算符浅析

    千次阅读 2018-06-18 14:25:20
    在学习源码中,发现有大量使用位运算符,这样做的目的是为了节约内存开销和加快计算效率。 位运算符,这个””代表这什么? :二进制简称“”,是二进制记数系统中表示小于2的整数的符号,一般用1或 0表示...
  • 参考:《Java语言程序设计》第二章   《Java核心技术 卷I:基础知识》第三章 #######################...在Java中,有关的运算有两类:位运算符运算(Bitwise)和移位运算(Shift)。 位运算符只能用于整型数据,包括
  • Java 位运算符和移位运算符

    千次阅读 2017-11-15 18:40:13
    参考:Bitwise and Bit Shift Operators《Java 编程思想 第3章 操作符》今天学习 Java BitSet 类时,发现对于位运算符和移位运算符的操作有些陌生,所以重新复习一下主要内容: 操作浅析 位运算符 移位运算符 ...
  • JAVA 位运算符和位移运算符

    千次阅读 2015-06-01 13:35:20
    java位运算符包括  &(与) AND  |(或) OR  ^(异或) XOR  ~(非) NOT  移运算符包括  >>(右移)  >>>(右移,左边空出的以0填充)  顾名思义,位运算符用于运算,那就只能对整型或者字符...
  • Java语言提供了7个操作运算符。这些运算符只能用于整型操作数,这些整数操作数包括long,int,short,char和byte。这里注意,相对于C/C++,Java多了一个位运算符“>>>”,整型操作数也多了一个byte类型(C/C++中...
  • Java位运算符和移位运算符详解

    千次阅读 2019-03-27 11:48:40
    位运算符主要针对二进制,它包括了:“与”、“非”、“或”、“异或”。 移位运算符包括,“左移运算符”,“有符号右移运算符”、“无符号右移运算符”。 运算 异或 ^ 异或运算符是用符号“^”表示的,其...
  • java位运算符

    2015-03-21 13:22:44
    java支持的位运算符有如下 & 按与 | 按或 ~按非 ^按异或 左移运算符  >>右移运算符  >>> 无符号右移运算符 负数以补码存储。左移后右边补零 右移运算符>>正数补0负数补1,而>>>总是补0对于低于...
  • java 位运算符

    2014-04-23 12:22:58
    移位运算符就是在二进制的基础上对数字进行平移。按照平移的方向和填充数字的规则分为三种:>(带符号右移)和>>>(无符号右移)。 yi'wei'yu'h
  • 位运算符 位运算符:对二进制的直接运算 计算机内部的数据都是以二进制形式存在的,而二进制在计算机内部又有多种编码方式 (计算机内部对二进制进行运算用的是补码) 原码:第一是符号 0正1负 3: 0000 ...
  • Java位运算符优先级

    千次阅读 2018-04-15 01:08:52
    Java运算符优先级(from 百度百科):运算符结合性[ ] . ( ) (方法调用)从左向右! ~ ++ -- +(一元运算) -(一元运算)从右向左* / %从左向右+ -从左向右&lt;&lt; &gt;&gt; &gt;&gt;...
  • Java 位运算符 深入理解

    千次阅读 2015-07-21 21:48:44
    Java中存在着这样一类操作符,是针对二进制进行操作的,它们分别是&、|、^、~、>>、>>几个操作符,无论是初始值是按照何种进制,都会换算成二进制进行 操作。接下来对这几种操作符进行一下简单的讲解。 &: ...
  • java位运算符运算表达式

    千次阅读 2014-03-12 09:30:36
    java位运算符运算表达式 > 右移 x>>a X各比特右移a >> 不带符号的右移 x>>>a X各比特右移a,左边的空位填零 注:运算符中,除~以外,其余均为二元运算符,操作数只能为整型和字符型数..." itemprop=...
  • Java 位运算符

    千次阅读 2008-09-02 19:07:00
    http://blog.csdn.net/vvggsky/archive/2007/04/16/1565946.aspx vvggskyID:vvggskyJava 定义的运算(bitwise operators )直接对整数...表4-2 列出了运算: 表4.2 位运算符及其结果 运算符 结果 ~ 按
  • 位运算符介绍(二):Java位运算符

    千次阅读 2010-07-08 13:00:00
    Java语言提供了7个操作运算符。这些运算符只能用于整型操作数,这些整数操作数包括long,int,short,char和byte。这里注意,相对于C/C++,Java多了一个位运算符“>>>”,整型操作数也多了一个byte类型(C/C++中...
  • 1. Java中的位运算符 (1) 与&amp;: 对运算符两侧以二进制表达的操作符按分别进行'与'运算。 操作的规则是:仅当两个操作数都为1时。输出结果才为1。否则为0 例:12 &amp; 5 = 1100 &amp; 0101 = ...
  • 最近刚重拾编程序的工作,说实话内心是崩溃的,不该会的还是不会...Java运算符可分为4类:算术运算符、关系运算符、逻辑运算符位运算符. 1.算术运算符  Java的算术运算符分为一元运算符和二元运算符.一元运算
  • 逻辑运算符的基本用法 * 逻辑运算符有哪些 * &amp;,|,^,!... * b:表达式:就是用运算符把常量或者变量连接起来的符合java语法的式子。 * 算术表达式:a + b * 比较表达式:a == b(条件表达式)...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 229,658
精华内容 91,863
关键字:

关于java位运算符

java 订阅