java位运算和无符号运算

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

计算规则:

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

  负数的原码首先计算其二进制数,然后最高位使用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    移位   (移位得到的是正数,所以补码就是其本身)
         * */

时间: 2024-08-04 12:01:58

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

【C语言位运算的应用】如何按bit位翻转一个无符号整型

其实现思路如下: 将目标数值进行末尾比特位摘取,将所摘取的bit位放到一个相同类型的末尾,目标数值bit位右移,相同类型bit位左移. C语言的位运算符:     实现代码如下: #include <stdio.h>//按位翻转一个无符号整形 unsigned int reverse_bit(unsigned int value) { unsigned int num = 0; int i = 0; for (i = 1; i < 32; i++) { num += value &

Verilog -- 有符号与无符号运算

目录 Verilog中有符号与无符号的加法和乘法运算 无符号乘法和加法 有符号乘法和加法 有符号和无符号运算 参考: https://blog.csdn.net/vivid117/article/details/101427302 http://wscentity.lofter.com/post/1d00edbd_6476453 Verilog中有符号与无符号的加法和乘法运算 无符号乘法和加法 对于无符号的乘法和加法,没有什么好说的,就是直接用'*'和'+'. 有符号乘法和加法 有符号和无符号运

JavaScript 32位整型无符号操作

在 JavaScript 中,所有整数字变量默认都是有符号整数,这意味着什么呢? 有符号整数使用 31 位表示整数的数值,用第 32 位表示整数的符号,0 表示正数,1 表示负数. 数值范围从 -2^31 - 2^31-1 即 -2147483648 到 2147483647. JavaScript 进行位操作时,是采用32位 有符号 整型,这意味着其转换的结果也是32位有符号整型. 有些时候,我们进行移位会出现意想不到的结果,以下是C语言 与 JS 的对比. C语言 1 unsigned in

Java 接收 C/C++ 无符号int数值的方法

由于C/C++ 无符号整型int四字节大小,而JAVA只有有符号int,所以JAVA中的int不可以直接接收C/C++无符号整型int,需要用long来接收.但是用long来接收的话字符序列需要转换,高低位互换,可以用JDK里面Integer的reverseBytes()方法来进行互换: Integer.reverseBytes((int)ReceiveNum)&0xFFFFFFFFL; Java 接收 C/C++ 无符号int数值的方法,布布扣,bubuko.com

java位运算

Java的位运算(bitwise operators)直接对整数类型的位进行操作,这些整数类型包括long.int.short.char和 byte,位运算符具体如下表: 运算符 说明 << 左移位,在低位处补0 >> 右移位,若为正数则高位补0,若为负数则高位补1 >>> 无符号右移位,无论正负都在高位补0 & 与(AND),对两个整型操作数中对应位执行布尔代数,两个位都为1时输出1,否则0. | 或(OR),对两个整型操作数中对应位执行布尔代数,两个位

Java 位运算超全面总结

1.原码.反码.补码 关于原码.反码.补码的相关知识作者不打算在这里长篇大论,相关知识已有别的大佬总结很好了,还请老铁自行 Google,不过有篇知乎回答是作者学编程以来见过对相关知识最通俗易懂,生动简洁的解释:对原码.反码.补码最通俗易懂,生动简洁的解释,墙裂建议大家先看完这篇科普文章.在继续讨论之前你要先明白一点:整数在计算机内部都是以补码形式存储的. 2.Java 位运算概览 OK 都看到这儿了那我就假定你已经掌握了原码.反码.补码相关知识(虽然上面那段几乎啥也没讲,纯凑字数) 不废话了.

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

0.   Java基本数据类型 Java的位运算(bitwise operators)直接对整数类型的位进行操作,这些整数类型包括long.int.short.char和 byte,位运算符具体如下表: 运算符 说明 << 左移位,在低位处补0 >> 右移位,若为正数则高位补0,若为负数则高位补1 >>> 无符号右移位,无论正负都在高位补0 & 与(AND),对两个整型操作数中对应位执行布尔代数,两个位都为1时输出1,否则0. | 或(OR),对两个整型操

Verilog中的符号运算

在Verilog-1995中,只有integer数据类型被转移成有符号数,而reg和wire数据类型则被转移成无符号数.由于integer类型有固定的32位宽,因此它不太灵活. 在Verilog-2001中,有符号形式也被扩展到reg和wire数据类型中.新加一个关键字,signed,可以按照下面的方式定义: reg     signed[7:0] test; wire    signed[7:0] test_w; 下面是一些有符号计算以及赋值语句实例: 可见,在进行有符号运算时,表达式中的变量

java中的无符号移位运算

1. 无符号右移   >>>  或 >>> = 无符号右移(>>>)跟右移(>>)运算符不一样. 右移不改变数的正负. 对于一个正数,无符号右移不会变成负数(相当于除以1再取整):但是对于一个负数,无符号右移会将负数变成正数: int i = -4; System.out.printf("%-10d %32s\n", i, Integer.toBinaryString(i)); i >>>= 1;  /