计算机在底层使用的是二进制补码进行运算。

计算规则:

  正数的原码、反码、补码是其二进制本身。

  负数的原码首先计算其二进制数,然后最高位使用1表示负数,反码是最高位不变其它位取反,补码是在反码的基础上进行+1操作。

  System.out.println( 8 >> 1);//正数进行右移位运算

8的二进制是 0000 0000 0000 0000 0000 0000 0000 1000,进行右移1位得到二进制0000 0000 0000 0000 0000 0000 0000 0100,然后转成二进制是4
  以此类推

   /*   1000
         *   0100    4    右移1位
         *   0010    2    右移2位
         *   0001    1    右移3位
         *   0000    0    右移4位
         * */

System.out.println( -8 >> 1);//负数进行右移位运算  (右移高位补1)

-8的二进制是1000 0000 0000 0000 0000 0000 0000 1000,这里最高位1表示是负数

  /*
         * 1000 0000 0000 0000 0000 0000 0000 1000 原码
         * 1111 1111 1111 1111 1111 1111 1111 0111 反码
         *                                       1
         * 1111 1111 1111 1111 1111 1111 1111 1000   补码
         * 1 1111 1111 1111 1111 1111 1111 1111 100 位运算得到的是补码然后转到原码
         * 1 0000 0000 0000 0000 0000 0000 0000 011
         *                                           1
         * 1 0000 0000 0000 0000 0000 0000 0000 100 -4  原码
         * */

   System.out.println(8<<2);//正数进行左移位运算

/*

   * 0000 0000 0000 0000 0000 0000 0000 1000  原码

   * 0000 0000 0000 0000 0000 0000 0010 0000 位运算 32

   */

   System.out.println(-8<<2);//负数进行左移位运算(左移地位补0)
        /* 1000 0000 0000 0000 0000 0000 0000 1000   -8的原码
         * 1111 1111 1111 1111 1111 1111 1111 0111   反码
         * 1111 1111 1111 1111 1111 1111 1111 1000   补码
         * 11 1111 1111 1111 1111 1111 1111 100000  位运算
         * 10 0000 0000 0000 0000 0000 0000 011111 位运算之后补码
         * 10 0000 0000 0000 0000 0000 0000 100000 原码
         *  -32
         * */

  System.out.println(-9>>>2);无符号运算,高位进行补0,低位舍去
        /*    
         * 1000 0000 0000 0000 0000 0000 0000 1001    原码

    * 1111 1111 1111 1111 1111 1111 1111 0110 反码
         * 1111 1111 1111 1111 1111 1111 1111 0111    补码
         * 001111 1111 1111 1111 1111 1111 1111 01    移位   (移位得到的是正数,所以补码就是其本身)
         * */

java位运算和无符号运算的更多相关文章

  1. JavaScript 32位整型无符号操作

    在 JavaScript 中,所有整数字变量默认都是有符号整数,这意味着什么呢? 有符号整数使用 31 位表示整数的数值,用第 32 位表示整数的符号,0 表示正数,1 表示负数. 数值范围从 -2^ ...

  2. java位运算

    Java的位运算(bitwise operators)直接对整数类型的位进行操作,这些整数类型包括long.int.short.char和 byte,位运算符具体如下表: 运算符 说明 << ...

  3. java位运算,逻辑运算符

    位运算逻辑运算符包括: 与(&),非(~),或(|),异或(^). &:  条件1&条件2  ,只有条件1和条件2都满足, 整个表达式才为真true,  只要有1个为false ...

  4. Java 位运算超全面总结

    1.原码.反码.补码 关于原码.反码.补码的相关知识作者不打算在这里长篇大论,相关知识已有别的大佬总结很好了,还请老铁自行 Google,不过有篇知乎回答是作者学编程以来见过对相关知识最通俗易懂,生动 ...

  5. Java位运算总结

    关于位运算,以前也见过,搜过,当时会用了,过后就忘了,今天好好学习一遍,然后整理一下. Java中的位运算,涉及到计算机的二进制,位用bit表示,1Byte=8bit,根据各种基本数据类型占用的字节空 ...

  6. Java 与无符号那些事儿

    最近在使用 Java 作为 WebSocket 客户端连接 Node.js 的 WebSocket 服务器的时候,由于使用的客户端库比较老,所以遇到了字节符号的问题,上网查了一下,看到这篇文章写的很有 ...

  7. 【Java基础】基本类型与运算【重要】

    0.   Java基本数据类型 Java的位运算(bitwise operators)直接对整数类型的位进行操作,这些整数类型包括long.int.short.char和 byte,位运算符具体如下表 ...

  8. unsigned无符号、有符号类型的符号拓展

    先看一段代码 #include <stdio.h> main(){ unsigned ; char b = a; printf("%d %d",a,b); ; } a输 ...

  9. [JAVA]移位运算(左移<<,右移>>和无符号右移>>>)

    一.背景知识 整数在内存中是以二进制的形式存在的,而且存的是该整数的补码.最高位代表符号位,正数为0,负数为1 正数的补码是其二进制本身,负数的补码则是 符号位保持1不变,其他位按位取反再加1,+0和 ...

随机推荐

  1. 【JZOJ4928】【NOIP2017提高组模拟12.18】A

    题目描述 数据范围 对于100%的数据,n<=100000,1<=A[i]<=5000 =w= Ans=∏1ai 代码 #include<iostream> #inclu ...

  2. install4j的使用

    用java写好了桌面应用,怎么搞成 那种常见的 双击之后 next.next...安装完成的按照包呢?用install4j.这东西有多好用呢?看看这款xml编辑软件,就是用install4j封装的安装 ...

  3. 洛谷 P2486 [SDOI2011]染色 树链剖分

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 思路 PushDown与Update Q AC代码 总结与拓展 题面 题目链接 P2486 ...

  4. 网络流24题 骑士共存(DCOJ8023)

    题目描述 在一个 n*n 个方格的国际象棋棋盘上,马(骑士)可以攻击的棋盘方格如图所示.棋盘上某些方格设置了障碍,骑士不得进入. 对于给定的 n*n 个方格的国际象棋棋盘和障碍标志,计算棋盘上最多可以 ...

  5. Linux配置redis开机启动(CentOS 7)

    https://blog.csdn.net/qq_31803503/article/details/79246205 本次配置linux版本是CentOS 7 首先将  redis-3.2.3/uti ...

  6. 【JZOJ4847】【NOIP2016提高A组集训第5场11.2】夕阳

    题目描述 "我有个愿望,我希望在灿烂千阳时遇见你." 这是个有n个点的世界,有m条无向边连接着这n个点,但是不保证点之间能够互相到达. "这个世界的夕阳,只在奇数长的简单 ...

  7. MySQL中使用LIMIT进行分页的方法

    一.分页需求: 客户端通过传递start(页码),pageSize(每页显示的条数)两个参数去分页查询数据库表中的数据,那我们知道MySql数据库提供了分页的函数limit m,n,但是该函数的用法和 ...

  8. UVA_445:Marvelous Mazes

    Language:C++ 4.8.2 #include<stdio.h> #include<string.h> #include<ctype.h> int main ...

  9. JQ取消hover事件

    $('a').unbind('mouseenter').unbind('mouseleave');

  10. shell学习(20)- xargs

    xargs 是给命令传递参数的一个过滤器,也是组合多个命令的一个工具. xargs 可以将管道或标准输入(stdin)数据转换成命令行参数,也能够从文件的输出中读取数据. xargs 也可以将单行或多 ...