zoukankan      html  css  js  c++  java
  • Java中正数与负数操作>>、>>>的区别

    以下为个人理解,有不对的地方请提出

    Java中,>>、>>>都是在数字的二进制的补码中进行的

    正数的补码为本身 如
    33的二进制表示为 00000000 00000000 00000000 00100001 补码为 00000000 00000000 00000000 00100001

    负数的补码为符号位即最高位1不变(负数符号位为1,正数为0),其余各位取反,再加1 如
    -33的二进制表示为 10000000 00000000 00000000 00100001 补码为 11111111 11111111 1111111 11011111

    进行右移>>操作
    33>>5 即 补码 00000000 00000000 00000000 00100001 右移5位 00000000 00000000 00000000 00000001 
    因为33为正数,再取补码为 00000000 00000000 00000000 00000001 转为十进制为1 即33>>5=1

    -33>>5 即 补码 11111111 11111111 1111111 11011111 右移5位 00000111 11111111 11111111 11111110
    因为-33为负数,再取补码为 00000100 0000000 0000000 00000010 最前一位1为符号位 转为十进制为-2 即-33>>5=-2

    进行无符号右移>>>操作
    33>>>5 即 补码 00000000 00000000 00000000 00100001 右移5位 00000000 00000000 00000000 00000001 
    因为无符号位,代表结果肯定为正数,正数取补码为本身 00000000 00000000 00000000 00000001 转为十进制为1 即33>>>5=1

    -33>>>5 即 补码 11111111 11111111 1111111 11011111 右移5位 00000111 11111111 11111111 11111110
    因为无符号位,代表结果肯定为正数,正数取补码为本身 00000111 11111111 11111111 11111110 转为十进制为134217726 即-33>>>5=134217726

    [java] view plaincopy
     
    1. public class Operator  
    2. {  
    3.      public static void main(String[] args)  
    4.      {  
    5.           System.out.println(33>>5);  
    6.       System.out.println(-33>>5);  
    7.       System.out.println(33>>>5);  
    8.       System.out.println(-33>>>5);  
    9.      }  
    10. }  

    以上为个人理解,如有不对的地方,请各位指正。

  • 相关阅读:
    OCP-1Z0-053-V12.02-15题
    Boost.Asio性能测试
    使用asio搭建服务器
    boost::asio::ip::tcp::socket is connected?(如何知道socket的链接是链接或断开?)
    boost::async_read_some连续接收数据
    基于boost asio实现的支持ssl的通用socket框架
    Boost.Asio的使用技巧
    Matlab基本函数-expm函数
    Matlab基本函数-exp函数
    OCP-1Z0-053-V12.02-337题
  • 原文地址:https://www.cnblogs.com/daojian/p/4910568.html
Copyright © 2011-2022 走看看