精华内容
下载资源
问答
  • 一直以来对二进制的操作计算不太清楚,这次找了一些资料完整地进行了一些总结。 一、进制类别和关系: 二进制,十进制,十六进制的区别和进制之间的相互转换方法(概念性的东西,可以百度)。 n位的二进制能够表示...

    写在前面

    一直以来对二进制的操作计算不太清楚,这次找了一些资料完整地进行了一些总结。


    一、进制类别和关系:

    1. 二进制,十进制,十六进制的区别和进制之间的相互转换方法(概念性的东西,可以百度)。
    2. n位的二进制能够表示2的n次方个数,如4位的二进制可以表示十进制的0~15共16个数 。
    3. 十六进制的基数是16,数码为0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F,其中用A,B,C,D,E,F(字母不区分大小写)这六个字母来分别表示10,11,12,13,14,15。
    4. 由于十六进制的基数是2的幂,因此二进制和十六进制的转换很方便。一个二进制数,只要把它从低位到高位每4位组成一组,4个二进制位可以表示从0到15的数字,这刚好是1个16进制位可以表示的数据,也就是说,将二进制转换成十六进制只要每4位进行转换就可以了。
      • 0011 0101 1011 1111 = 0x35BF(以0x开始的数据表示16进制) 。
      • MIN_VALUE = 0x80000000对应的二进制是10000000 00000000 00000000 00000000
      • MAX_VALUE = 0x7fffffff对应的二进制是01111111 11111111 11111111 11111111

    二、移位操作

    1. 左移位<< :
    /* 00000001 << 1 = 00000010 */
        1 << 1 == 2 
    /* 00000001 << 3 = 00001000 */
        1 << 3 == 8
    复制代码
    1. 右移位>> :
      向右移位是有符号操作符。和许多语言一样,Java使用最高位来表示数值的正负,负数的最高位永远为1。一个以1开头的二进制数移位后还将以1开头,一个以0开头的二进制数移位后还将以0开头。
    /* 11111111 11111111 11111111 11110000 >> 4 = 11111111 11111111 11111111 11111111 */
        0xFFFFFFF0 >> 4 == 0xFFFFFFFF 
    	 
    /* 00001111 11111111 11111111 11111111 >> 4 = 00000000 11111111 11111111 11111111 */
        0x0FFFFFFF >> 4 == 0x00FFFFFF
    复制代码
    1. 无符号右移>>> :这种移位会忽略符号位并总是用“0”来填充。
    /* 10000000 00000000 00000000 00000000 >>> 1 = 01000000 00000000 00000000 00000000 */
        0x80000000 >>> 1 == 0x40000000
    复制代码
    1. 移位的作用
    • 迅速求2的幂。1向左移位1位是2,移2位是4,移3位是8…… 相似的,向右移1位相当于是把该数除以2。(将一个数k移动n位,可以看做将k*2^n)
    • 创建掩码。位掩码可用于屏蔽或者修改一个二进制数中的某些指定位。如得到00001000的掩码可以通过1 << 3得到。

    三、位运算操作符

    1. ~ :按位取反,如果位为0,结果是1,如果位为1,结果是0
        ~1111 == 0000
        ~0011 == 1100
    复制代码
    1. & : 按位与,两个操作数中位都为1,结果才为1,否则结果为0
        1010 & 0101 == 0000
        1100 & 0110 == 0100
    复制代码
    1. ^ : 按位异或,两个操作数的位中,相同则结果为0,不同则结果为1
        1010 ^ 0101 == 1111
        1100 ^ 0110 == 1010
    复制代码
    1. | : 按位或,两个位只要有一个为1,那么结果就是1,否则就为0
        1010 | 0101 == 1111
        1100 | 0110 == 1110
    复制代码
    1. 位运算符的作用:
    • 可以选择性的把一个二进制数的某位设为0,让数与一个全1但是某位为0的数相与。如,01010101 & ~(1<<2) == 01010101 & 11111011 == 01010001

    四、原码, 反码, 补码:

    对于一个数, 计算机要使用一定的编码方式进行存储。原码,反码,补码是机器存储一个具体数字的编码方式。

    1. 机器数和真值
      • 机器数:一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1。如,00000011 和 10000011这两个机器数分别表示+3和-3。
      • 真值:将带符号位的机器数对应的真正数值称为机器数的真值。如,10000011其最高位 1 代表负,其真正数值是 -3而不是形式值131(10000011转换成十进制等于131)。
    2. 原码:符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值.如,[+1]原 = 0000 0001,[-1]原 = 1000 0001
      • 因为第一位是符号位, 所以 8 位二进制数的取值范围是:[1111 1111 , 0111 1111] 即 [-127 , 127]
      • 原码是人脑最容易理解和计算的表示方式.
    3. 反码:正数的反码是其本身,负数的反码是在其原码的基础上,符号位不变,其余各个位取反。如,[+1] = [00000001]原 = [00000001]反 / [-1] = [10000001]原 =[11111110]反
      • 如果一个反码表示的是负数,人脑无法直观的看出来它的数值.通常要将其转换成原码再计算.
    4. 补码:正数的补码就是其本身,负数的补码是在其原码的基础上,符号位不变,其余各位取反, 最后 +1. (即在反码的基础上 +1)
      • 对于负数, 补码表示方式也是人脑无法直观看出其数值的。通常也需要转换成原码再计算其数值。
    5. 为何要使用反码和补码
      • 设计简单:因为人脑可以知道第一位是符号位,在计算的时候我们会根据符号位,选择对真值区域的加减。但是对于计算机,加减乘数是最基础的运算,要设计地尽量简单。而让计算机辨别"符号位"会让计算机的基础电路设计变得十分复杂。
      • 加法设计:可以用符号位参与运算来简化设计。根据运算法则减去一个正数等于加上一个负数, 即: 1-1=1+(-1)=0,所以机器可以只有加法而没有减法,这样计算机运算的设计就更简单了。
      • 原码直接符号位相加,得到的结果是错误的,因此需要使用反码和补码
    6. 反码加法:
      反码加法结果的真值部分是正确的,但是在"0"这个特殊的数值上,虽然人们理解上 + 0和 -0 是一样的, 但是 0 带符号是没有任何意义的, 而且会有 [0000 0000]原和[1000 0000]原两个编码表示 0。
    // 计算十进制的表达式: 1 - 1 = 0
        1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
    复制代码
    1. 补码加法:
        1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原
    复制代码
    • 这样 0 用 [0000 0000] 表示,而反码出现问题的-0则不存在了,而且可以用多余的[1000 0000] 表示 -128:
        (-1) + (-127) = [1000 0001]原 + [1111 1111]原 = [1111 1111]补 + [1000 0001]补 = [1000 0000]补
    复制代码
    • 在用补码运算的结果中,[10000000]补就是-128,但是注意因为实际上是使用以前的-0的补码来表示 -128, 所以 -128并没有原码和反码表示(对-128的补码表示[10000000]补算出来的原码是[0000 0000], 这是不正确的)
    • 使用补码运算能够多表示一个最低数,这就是为什么8位二进制,使用原码或反码表示的范围为 [-127, +127], 而使用补码表示的范围为 [-128, 127]。

    五、Integer的MIN_VALUE和MAX_VALUE

    1. 计算机存储数字是使用补码, 所以对于编程中常用到的 32 位int类型,可以表示范围是: [-2^31, 2^31-1] 因为第一位表示的是符号位,而使用补码表示时又可以多保存一个最小值。
    2. 从表示的数字总数来说,还是 2^31*2(因为正负值,所以*2)
      • 对于正数的2^31来说,[00000000 00000000 00000000 00000000]表示了0,所以正数的最大值是2^31-1(因为一种排列一个数,数与数之间都是隔1,所以正数总数-1即正数的最大值)。
      • 对于负数的2^31来说,[10000000 00000000 00000000 00000000]表示了最大值,所以负数的最大值是-2^31,多表示了一个数。
    3. Integer.MAX_VALUE,即2^31-1=2147483647,最小值为-2^31=Integer.MIN_VALUE -2147483648
    4. 越界问题
    • Integer.MIN_VALUE-1 = Integer.MAX_VALUE:
        Integer.MIN\_VALUE - 1 = Integer.MIN_VALUE + (-1)
        
        10000000000000000000000000000000
    +   11111111111111111111111111111111[补]
    ---------------------------------------------------
        1,01111111111111111111111111111111[补]
        舍弃最高位的进位,所以得到的就是Integer.MAX_VALUE
    复制代码
    • Integer.MAX_VALUE + 1= Integer.MIN_VALUE:
      对Integer.MAX_VALUE加1,2147483648(越界了),结果是-2147483648,即是Integer.MIN_VALUE。
            01111111111111111111111111111111
        +   00000000000000000000000000000001[正数补码等于本身]
    ---------------------------------------------------
            10000000000000000000000000000000[补]
    复制代码
    • 对Integer.MIN_VALUE取绝对值:
      因为值为-2147483648,绝对值2147483648超过Integer.MAX_VALUE 2147483647,所以值还是Integer.MIN_VALU。因为,Integer.MAX_VALUE=01111111111111111111111111111111,再加1为10000000000000000000000000000000,等于Integer.MIN_VALUE

    四、Java中的方法

    • java代码里操作二进制数字的方法是使用Integer.parseInt()方法。如,Integer.parseInt(“101″,2)代表着把二进制数101转换为十进制数5。

    五、参考资料

    文章一文章二文章三文章四文章五

    展开全文
  • #举例: package javaLianXi1;...* 计算(11111111)2=(————————————)10 * */ public static void main(String[] args) { System.out.println(Math.pow(2, 7)+ Math.pow(2, 6)+ Math.pow(2, 5)+ Math...

    #举例:
    package javaLianXi1;
    public class Test01 {
    /

    * 计算(11111111)2=(————————————)10
    *
    */
    public static void main(String[] args) {
    System.out.println(Math.pow(2, 7)+
    Math.pow(2, 6)+
    Math.pow(2, 5)+
    Math.pow(2, 4)+
    Math.pow(2, 3)+
    Math.pow(2, 2)+
    Math.pow(2, 1)+
    Math.pow(2, 0));
    }
    }
    虽然这种代码能够实现计算,但是相对于方便程度来说,这个还是太过于复杂了,我们有一种更简单方便的方法:System.out.println(Math.pow(2, 8)-1);因为我们编译完成运行后已经得知第一个代码输出之后的值为255.0,而2的8次方是256,那么我们只需在(Math.pow(2,8));减一个1就好了。
    编译完成后,运行结果如下图,两次打印输出后的结果都为255.0。
    运行结果图

    展开全文
  • JAVA十进制转二进制

    2021-04-07 15:24:12
    JAVA十进制转二进制代码按位与运算无符号右移方法的调用无返回值 代码 因为计算机本身就是二进制存储数据,所以只需要把所需转化的数字的每一位和1进行与运算,再对每一位进行输出即可 public static void main...

    十进制转二进制

    方法1:右移输出

    因为计算机本身就是二进制存储数据,所以只需要把所需转化的数字的每一位和1进行 与 运算,再从int类型第一位开始对每一位进行输出即可,每输出4次输出一次空格。

    public static void main(String[] args) {
         Scanner sc = new Scanner(System.in);
         System.out.println("请输入要转换的正整数:");
         int n = sc.nextInt();
         System.out.print(n + " 转化为二进制的数为:");
         binaryNum(n);
     }
     public static void binaryNum(int n) {
         int i,j=0;;
         for (i = 31; i >= 0; i--){
             System.out.print((n>>>i) & 1);
             j++;
             if (j==4){
                 System.out.print(" ");
                 j=0;
                 continue;
             }
         }
     }
    

    相关知识点:
    1.按位与运算
    2.无符号右移

    3.方法的调用与接收
    4.无返回值

    5.Scanner输入
    6.for循环

    方法2:余数存数组再进行输出

    十进制转二进制时如何运算,大家都知道。我们要做的就是把运算过程交给计算机,直接得到结果,但是每次的余数都输出出来后,得到的一组数并不是我们要求的二进制数,而是我们所求二进制数的反序,这个时候需要反序来输出,我们就需要引入一个数组的方法。

     public static void main(String[] args) {
    	System.out.println("请输入一个整数");
    	Scanner sc = new Scanner(System.in);
    	int a = sc.nextInt();
    	int b, i;
    	int[] array = new int[32];
    	for (i = 0; i < array.length; i++) {
    	    b = a % 2;
    	    a = a / 2;
    	    array[i] = b;
    	}
    	System.out.print("这个数对应的二进制数为:");
    	for (i = 31; i >= 0; i--) {
    	    if ((i+1)%4 == 0){
    	        System.out.print(" ");
    	    }
    	    b=array[i];
    	    System.out.print(b);
    	}
    }
    

    相关知识点:
    1.Scanner输入
    2.for循环

    3.数组的定义及赋值

    展开全文
  • Java Language——常见二进制计算

    千次阅读 多人点赞 2016-05-22 16:08:11
    二进制计算技术中广泛采用的一种数制。二进制数据是用 0 和 1 两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。在 Java 中,二进制运算符有左移保留符号位 ,右移保留符号位 >...

    二进制是计算技术中广泛采用的一种数制。二进制数据是用 0 和 1 两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。在 Java 中,二进制运算符有左移保留符号位 <<,右移保留符号位 >>,右移符号位也一起移动 >>>,按位取反 ~,异或 ^,逻辑与 &,逻辑或 | 等。

    展开全文
  • java二进制运算符

    2020-05-17 00:12:13
    一、二进制 二进制(binary)在数学和数字电路中指以2为基数的记数系统 计算机的二进制中用 0表示正数 1表示负数 十六进制:有一个前缀0X或0x 八进制:前缀是0,最好不用,容易混淆 二进制:前缀是0b或0B 二进制...
  • Java二进制、八进制、十进制、十六进制及其相互转换 进制的基本介绍 所有数字在计算机底层都以二进制形式存在。 对于整数,有四种表示方式: 二进制(binary): 0,1 ,满2进1.以0b或0B开头。 十进制(decimal): 0-9 ...
  • JAVA 二进制基础

    2018-02-12 09:46:00
    主要内容 1.十进制二进制互转 ...二进制的位运算:优点:特定情况下,计算方便,被支持面广泛。 ① 按位与& (两位全位1,结果才为1) 0与0=0;0与1=0;1与0=0; 1与1=1; 例:51与5 00110011 -----...
  • 一,二进制的算法 是将一个数进行处于2得到的余数1,或0进行收集! 余数收集是从最下向上进行依次排列 如: 5的二进制应该是:0000 0101 而转化为十进制应该是:从最低为乘以2的0次方开始依次进行相加 最低为: 从左...
  • JAVA二进制详解

    千次阅读 2017-07-18 20:00:01
    计算机内存中只有二进制,任何数据都需要转换为2进制才能计算处理2、十进制 逢十进一,99进位连续进两位,以此类推 数字: 0 1 2 3 4 5 6 7 8 9 权:10000 1000 100 10 1 基数:10 权是基数的N次幂3、...
  • JAVA二进制基础

    2017-11-09 15:10:52
    二进制计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”,由18世纪德国数理哲学大师莱布尼兹发现。当前的计算机系统使用的...
  • java 二进制与运算符

    2021-04-10 10:07:16
    二进制 十进制 1 2 4 8 16 32 二进制 1 10 100 1000 10000 100000 图1 图1是做进制运算时候,方便计算的一...
  • JAVA二进制转换

    2015-08-15 20:48:58
    进制的由来:任何数据在计算机中都是以二进制的形式存在的。二进制早期由电信号开关演变而来。 计算机为什么要采用二进制呢? 因为二进制具有运算简单,易实现且可靠,为逻辑设计提供了有利的途径、节省设备等优点...
  • java二进制

    2020-04-01 11:33:36
    java的数据是有符号的。 计算机保存正数负数都是以补码的形式: 正数的补码是本身,负数的补码是负数原码 除符号位 ,按位取反+1。 例如 一个byte字节 表示数据。 byte a=1<<6 ,1向左移动6位 , 0000 ...
  • java十进制二进制转换之移位操作

    千次阅读 2018-08-16 10:44:15
    java十进制二进制转换之移位,看了一些然后自己理解了一下现在就详细的讲解一下。 首先你得直到计算机内的存储都是采用0和1,是二进制序列来表示图像数字文字等等。 那么一个整数中正数是原码表示,负数和零用补码...
  • Java二进制Dos命令

    2018-07-21 23:01:40
    计算机中的数据不同于人们生活中的数据,人们生活采用十进制数(逢10进1),而计算机中全部采用二进制数表示,因为早期 计算机中电子元件只能表达通电、断电这两种状态,所以计算机就采用二进制二进制只包含0、1...
  • Java二进制补码示例

    2019-05-09 21:45:44
    二进制表示负数的问题 我们知道十进制数1的二进制码用int型表示就是0000 0000 0000 0000 0000 0000 0000 0001 二进制码实际上并不能表示负数, 因为二进制数最小就是0000 0000 0000 0000 0000 0000 0000 0000 , ...
  • Java十进制转二进制算法 一、编程思路 可以运用简单的数学的计算的方法。如下 这张图大家应该都不陌生,10(例子中的10)一直除以2,余数写在右面那一列,如果被整除右面写0,如果没有别整除,写他的余数,这样...
  • java十进制与二进制之间的转换

    千次阅读 2018-04-24 21:42:30
    1.正十进制转换成二进制除2取余法:让十进制整数不断除以2,并记录余数,直至商为0,把余数倒序排列得到的即为相应的二进制数例如十进制数11最终的结果为10112.正二进制转换为十进制计算机存储数据时按字节存储,一个字节...
  • 1.java二进制表示形式 2.移位操作符 1.左移位操作符(<<) 2.“有符号”右移位操作符(>>) 3.“无符号”右移位操作符(>>>) 4.注意 1.java二进制表示形式 java中数字的二进制表示形式...
  • java 二进制编码

    2014-04-29 00:14:00
    在计算机中,在java中,数据的二进制是以补码方式进行存储的 原码=最高的符号+真值 反码=最高符号号位不变,真值部分按位去反 补码=反码+1 位运算:  >>右移  <<左移  >>>无符号右移...
  • java 二进制的问题

    2016-07-22 16:30:09
    关于二进制  一. 概念  电子计算机处理的信息,都是仅用“0”与“1”两个简单数字表示的信息,或者是用这种数字进行了编码的信 息。这种数制叫做二进制。现在在使用的计算机基本上都是二进制进行运算的。那么...
  • java 二进制的理解

    2017-02-27 19:46:43
    机器数和真值1、机器数一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1.比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制...
  • 1. 二进制转十进制 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200821202448160.png#pic_center 例如 1101 S=1+0+4+8=13 2. 十进制转二进制 用十进制数持续除以2直至为0 例如十进制31 从下往上依次写出...
  • public static void main(String[] args) { System.out.println(2.0-1.1);...但是在二进制中,计算十分之一(1/10)就会出现无限循环的数.同理在十进制中,对三分之一进行运算会出现无限循环的数字.(...
  • JAVA二进制的前导的零

    2020-01-11 19:52:42
    二进制的前导的零(10分) 题目内容: 计算机内部用二进制来表达所有的值。一个十进制的数字,比如18,在一个32位的计算机内部被表达为00000000000000000000000000011000。可以看到,从左边数过来,在第一个1之前,...
  • 我们平时认识的数字比如1、2、3、4等数字叫做十进制数字,我们可以看懂,但是计算机无法运算,如果计算机要计算这些数字就得将这些数字转换成计算机能读懂的数据,计算只能读懂二进制数字,二进制的数字有什么特征呢...
  • 举例: byte b= (byte) 0b10000001; 对于这个赋值表达式,b的值是多少? 可能觉得10000001的值是-1,那么...其实,数值在计算机内部都是以补码形式存在的,输入的八、十、十六进制数都会转为二进制补码形式。 一般来
  • 计算机内部用二进制来表达所有的值。一个十进制的数字,比如18,在一个32位的计算机内部被表达为00000000000000000000000000011000。可以看到,从左边数过来,在第一个1之前,有27个0。我们把这些0称作前导的零。 ...
  • 进制对很多了解计算机的并不陌生,进制本身是一种记数方式,可用有限个符号表示无限的数.我们常见的进制有10进制,2进制,8进制以及16进制.之前我也在前面的博文中分享过个人一些进制方面的笔记.还是有人后台问我,为啥2...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 5,580
精华内容 2,232
关键字:

java二进制计算

java 订阅