Java >>>运算符 和 >> 运算符

最近在看java源码的时候发现,int型在序列化操作的时候,做了如下操作:

 //java.io.DataOutputStream#writeInt
 /**
     * Writes an <code>int</code> to the underlying output stream as four
     * bytes, high byte first. If no exception is thrown, the counter
     * <code>written</code> is incremented by <code>4</code>.
     *
     * @param      v   an <code>int</code> to be written.
     * @exception  IOException  if an I/O error occurs.
     * @see        java.io.FilterOutputStream#out
     */
    public final void writeInt(int v) throws IOException {
        out.write((v >>> 24) & 0xFF);
        out.write((v >>> 16) & 0xFF);
        out.write((v >>>  8) & 0xFF);
        out.write((v >>>  0) & 0xFF);
        incCount(4);
    }

平时见多了>>,倒是很少见>>>,这个是什么操作呢?

1.Java >>>运算符 和 >> 运算符

>>> 在java 表示有符号右移。什么意思呢?就是最高位符号位也会移动。

我们知道,>>表示有符号右移。
-1>> 1 = -1
-1>>2 = -1 还等于-1 右移多少位都是-1

>>>
-1 >>>1 = 2147483647
-1>>>2 = 1073741823
总结:
>>> 表示符号位也会跟着移动,比如 -1 的最高位是1,表示是个负数,然后右移之后,最高位就是0表示当前是个正数。
所以 -1 >>>1 = 2147483647
>> 表示无符号右移,也就是符号位不变。那么-1 无论移动多少次都是-1

————————
原文链接:https://www.cnblogs.com/caoxinyu/p/10568485.html

验证一下:

public class Demo05 {
    public static void main(String[] args) {
        //1.在计算机中,负数是以对应补码形式存放的
        //2.在Java中int占用四个字节
        //3.-1对应的补码形式:‭1111111 ‭1111111 ‭1111111 ‭1111111
        int v=-1;
//        (v >>> 24) & 0xFF;
        System.out.println((v >>> 24));//0000000 0000000 0000000 ‭1111111   255
//        (v >>> 16) & 0xFF;
        System.out.println((v >>> 16));//0000000 0000000 ‭1111111 ‭1111111   65535
//        (v >>>  8) & 0xFF;
        System.out.println((v >>> 8));// 0000000 1111111 ‭1111111 ‭1111111   16777215
//        (v >>>  0) & 0xFF;
        System.out.println((v >>> 0));// 1111111 1111111 ‭1111111 ‭1111111   -1
    }
}

2.关于整数左移和右移扩大或缩小倍数问题

观察如下数字的右移
十进制 二进制 右移后 对应十进制
2 0010 0001 1
3 0011 0001 1
4 0100 0010 2
6 0110 0011 3
8 1000 0100 4
9 1001 0100 3

可以这样来看,由于是二进制,相邻的两个数之间相差的权值为2,左移一位就相当于扩大2倍,右移一位相当于缩小2倍。这样左移n位或右移n位,扩大或缩小为原来的2^n倍(n>=1)。


参考链接:https://www.cnblogs.com/hongten/p/hongten_java_yiweiyunsuangfu.html



如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
posted @   cosmoswong  阅读(384)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程
点击右上角即可分享
微信分享提示