java:4-11位运算、原码反码补码

文章目录

  • 1.位运算
    • [1.1 7个位运算符【记】](#1.1 7个位运算符【记】)
    • [1.2 案例](#1.2 案例)
  • [2. 二进制在运算中的说明](#2. 二进制在运算中的说明)
  • [3. 原码反码补码](#3. 原码反码补码)
    • [3.1 八个原则【背】](#3.1 八个原则【背】)

1.位运算

1.1 7个位运算符【记】

  • java 中有 7 个位运算(&、|、^、~、>>、<<和 >>>)
    1. 按位与& : 两位全为1,结果为1,否则为0
      【两个数字同一个位子上都为1,则为1,否则为0】
    2. 按位或|: 两位有一个为1,结果为1,否则为0
    3. 按位异或^ : 两位一个为0,一个为1,结果为1,否则为0
      【2个数不同就是1,一样就是0】
    4. 按位取反~: 0->1,1->0
    5. 算术右移 >> : 符号位不变, 低位溢出,并用符号位补溢出的高位
    6. 算术左移 <<: 符号位不变, 低位补 0
    7. >>>逻辑右移:也叫无符号右移,运算规则是: 低位溢出,高位补 0

1.2 案例

  1. 2&3
java 复制代码
public class var01 {

	//编写一个main方法
	public static void main(String[] args) {
		//推导过程
		//1. 获得2的补码(计算机都使用补码运算)需要先知道2的原码。2是int为4个字节
		//2的原码为 00000000 00000000 00000000 00000010
		//2的补码为00000000 00000000 00000000 00000010(正数三码合一)
		
		//2. 获得3的补码。知3的原码为00000000 00000000 00000000 00000011
		//3的补码为00000000 00000000 00000000 00000011
		
		//3. 按位于&
		//00000000 00000000 00000000 00000010
		//00000000 00000000 00000000 00000011
		//00000000 00000000 00000000 00000010(按位于的计算结果)
		
		//4. 转为原码
		//结果的补码第一位(符号为为0,是正数)
		//原码与补码一致
		//00000000 00000000 00000000 00000010 = 2
		System.out.println(2&3); //输出2
	}
} 
  1. ~ -2
java 复制代码
public class var01 {

	//编写一个main方法
	public static void main(String[] args) {
		//推导过程
		// 1. 得到-2的原码10000000 00000000 00000000 00000010
		//-2反码11111111 11111111 11111111 11111101
		//-2补码11111111 11111111 11111111 11111110

		//2. 按位取反
		//~-2补码:00000000 00000000 00000000 00000001
		//~-2转为原码,结果为1(正数3码合一)
		System.out.println(~-2); //输出1
	}
} 
  1. ~ 2
java 复制代码
public class var01 {

	//编写一个main方法
	public static void main(String[] args) {
		//推导过程
		// 1. 得到2的原码00000000 00000000 00000000 00000010
		//2的补码00000000 00000000 00000000 00000010(正数三码合一)

		//2. 按位取反
		//~2补码:11111111 11111111 11111111 11111101
		//~2反码:11111111 11111111 11111111 11111100
		//~2原码:10000000 00000000 00000000 00000011(除了符号位,其他互换)
		//~2 = -3

		System.out.println(~2); //输出-3
	}
} 
  1. 2|3
java 复制代码
public class var01 {

	//编写一个main方法
	public static void main(String[] args) {
		//推导过程
		// 1. 得到2的原码00000000 00000000 00000000 00000010
		//2的补码00000000 00000000 00000000 00000010(正数三码合一)

		//2. 3的原码为00000000 00000000 00000000 00000011
		//3的补码为00000000 00000000 00000000 00000011

		//按位或
		//00000000 00000000 00000000 00000010
		//00000000 00000000 00000000 00000011
		//00000000 00000000 00000000 00000011(结果的补码)
		//结果为3
		System.out.println(2|3); //输出3
	}
} 
  1. 2^3
java 复制代码
public class var01 {

	//编写一个main方法
	public static void main(String[] args) {
		//推导过程
		// 1. 得到2的原码00000000 00000000 00000000 00000010
		//2的补码00000000 00000000 00000000 00000010(正数三码合一)

		//2. 3的原码为00000000 00000000 00000000 00000011
		//3的补码为00000000 00000000 00000000 00000011

		//按位异或
		//00000000 00000000 00000000 00000010
		//00000000 00000000 00000000 00000011
		//00000000 00000000 00000000 00000001(结果的补码)
		//结果为1
		System.out.println(2^3); //输出1
	}
} 
  1. int a=1>>2;
    1 => 00000000 00000000 00000000 00000001
    => 00000000 00000000 00000000 00000000
    【本质:算术右移1位 = 除1次2。ex. 1 / 2 / 2 =0】
  2. intc=1<<2;
    1 => 00000000 00000000 00000000 00000001
    =>00000000 00000000 00000000 00000100
    【本质:算术左移1位 = 乘1次2。ex. 122=4】
  3. 额外练习
    • ~2=? // 按位取反
    • 2&3=? // 2 按位与3
    • 2|3=?
    • ~-5=?
    • 13&7=?
    • 5|4=?
    • -3^3=? //^ 按位异或

2. 二进制在运算中的说明

  1. 二进制是逢2进位的进位制,0、1是基本算符。
  2. 现代的电子计算机技术全部采用的是二进制,因为它只使用0、1两个数字符号。非常简单方便,易于用电子方式实现。计算机内部处理的信息,都是采用二进制数来表示的。二进制 (Binary)数用0和1两个数字及其组合来表示任何数。进位规则是"逢2进1",数字1在不同的位上代表不同的值,按从右至左的次序,值以二倍递增。

3. 原码反码补码

3.1 八个原则【背】

  1. 二进制的最左位是符号位 :0表示正数,1表示负数(老韩口诀:0->0 1->-
  2. 正数 的原码,反码,补码都一样(三码合一
  3. 负数的反码=它的原码符号位不变,其它位取反(0->1,1->0)
  4. 负数的补码 = 它的反码+1,负数的反码 = 负数的补码-1
  5. 0的反码,补码都是0
  6. java没有无符号数,换言之,java中的数都是有符号的
  7. 计算机是以补码的方式来运算的.
  8. 当我们看运算结果 的时候,要看他的原码(重点)
相关推荐
喵叔哟4 分钟前
重构代码中引入外部方法和引入本地扩展的区别
java·开发语言·重构
尘浮生10 分钟前
Java项目实战II基于微信小程序的电影院买票选座系统(开发文档+数据库+源码)
java·开发语言·数据库·微信小程序·小程序·maven·intellij-idea
hopetomorrow24 分钟前
学习路之PHP--使用GROUP BY 发生错误 SELECT list is not in GROUP BY clause .......... 解决
开发语言·学习·php
不是二师兄的八戒34 分钟前
本地 PHP 和 Java 开发环境 Docker 化与配置开机自启
java·docker·php
小牛itbull34 分钟前
ReactPress vs VuePress vs WordPress
开发语言·javascript·reactpress
请叫我欧皇i43 分钟前
html本地离线引入vant和vue2(详细步骤)
开发语言·前端·javascript
闲暇部落1 小时前
‌Kotlin中的?.和!!主要区别
android·开发语言·kotlin
爱编程的小生1 小时前
Easyexcel(2-文件读取)
java·excel
GIS瞧葩菜1 小时前
局部修改3dtiles子模型的位置。
开发语言·javascript·ecmascript
chnming19871 小时前
STL关联式容器之set
开发语言·c++