DAY001_二进制运算

这篇具有很好参考价值的文章主要介绍了DAY001_二进制运算。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

左移和右移

无符号左移? Java没有无符号左移
无符号右移 左边补0
有符号右移 左边用原符号位补位 即正数补0效果同无符号右移、负数补1
有符号左移 右边补0
import org.junit.Test;

public class TestAaaBinary {

	@Test
	public void test01() {
		//调用 JDK 的自带方法 toBinaryString 输出二进制数
		test01(false);
		//自己写的打印,结果与上面是一样的
		test01(true);
	}

	private void test01(boolean print) {
		int num_5 = 5;
		int num_5_2 = -5;

		System.out.println("无符号右移:正数");
		for (int i = 0; i < 5; i++) {
			print(num_5 >>> i, print);
		}
		System.out.println("无符号右移:负数");
		for (int i = 0; i < 5; i++) {
			print(num_5_2 >>> i, print);
		}
		System.out.println("有符号右移:正数");
		for (int i = 0; i < 5; i++) {
			print(num_5 >> i, print);
		}
		System.out.println("有符号右移:负数");
		for (int i = 0; i < 5; i++) {
			print(num_5_2 >> i, print);
		}
		System.out.println("有符号左移:正数");
		for (int i = 0; i < 32; i++) {
			print(num_5 << i, print);
		}
		System.out.println("有符号左移:负数");
		for (int i = 0; i < 32; i++) {
			print(num_5_2 << i, print);
		}
	}

	private void print(int x, boolean print) {
		if (print) {
			print(x);
		} else {
			System.out.println(Integer.toBinaryString(x));
		}
	}

	/**
	 * 输出十进制数的二进制格式
	 */
	private void print(int num) {
		for (int i = 31; i >= 0; i--) {
			System.out.print((num & (1 << i)) == 0 ? "0" : "1");
		}
		System.out.println();
	}
}

输出如下:

无符号右移:正数
00000000000000000000000000000101
00000000000000000000000000000010
00000000000000000000000000000001
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000101
无符号右移:负数
11111111111111111111111111111011
01111111111111111111111111111101
00111111111111111111111111111110
00011111111111111111111111111111
00001111111111111111111111111111
00000111111111111111111111111111
00000011111111111111111111111111
00000001111111111111111111111111
00000000111111111111111111111111
00000000011111111111111111111111
00000000001111111111111111111111
00000000000111111111111111111111
00000000000011111111111111111111
00000000000001111111111111111111
00000000000000111111111111111111
00000000000000011111111111111111
00000000000000001111111111111111
00000000000000000111111111111111
00000000000000000011111111111111
00000000000000000001111111111111
00000000000000000000111111111111
00000000000000000000011111111111
00000000000000000000001111111111
00000000000000000000000111111111
00000000000000000000000011111111
00000000000000000000000001111111
00000000000000000000000000111111
00000000000000000000000000011111
00000000000000000000000000001111
00000000000000000000000000000111
00000000000000000000000000000011
00000000000000000000000000000001
11111111111111111111111111111011
有符号右移:正数
00000000000000000000000000000101
00000000000000000000000000000010
00000000000000000000000000000001
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000101
有符号右移:负数
11111111111111111111111111111011
11111111111111111111111111111101
11111111111111111111111111111110
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111111
11111111111111111111111111111011
有符号左移:正数
00000000000000000000000000000101
00000000000000000000000000001010
00000000000000000000000000010100
00000000000000000000000000101000
00000000000000000000000001010000
00000000000000000000000010100000
00000000000000000000000101000000
00000000000000000000001010000000
00000000000000000000010100000000
00000000000000000000101000000000
00000000000000000001010000000000
00000000000000000010100000000000
00000000000000000101000000000000
00000000000000001010000000000000
00000000000000010100000000000000
00000000000000101000000000000000
00000000000001010000000000000000
00000000000010100000000000000000
00000000000101000000000000000000
00000000001010000000000000000000
00000000010100000000000000000000
00000000101000000000000000000000
00000001010000000000000000000000
00000010100000000000000000000000
00000101000000000000000000000000
00001010000000000000000000000000
00010100000000000000000000000000
00101000000000000000000000000000
01010000000000000000000000000000
10100000000000000000000000000000
01000000000000000000000000000000
10000000000000000000000000000000
00000000000000000000000000000101
有符号左移:负数
11111111111111111111111111111011
11111111111111111111111111110110
11111111111111111111111111101100
11111111111111111111111111011000
11111111111111111111111110110000
11111111111111111111111101100000
11111111111111111111111011000000
11111111111111111111110110000000
11111111111111111111101100000000
11111111111111111111011000000000
11111111111111111110110000000000
11111111111111111101100000000000
11111111111111111011000000000000
11111111111111110110000000000000
11111111111111101100000000000000
11111111111111011000000000000000
11111111111110110000000000000000
11111111111101100000000000000000
11111111111011000000000000000000
11111111110110000000000000000000
11111111101100000000000000000000
11111111011000000000000000000000
11111110110000000000000000000000
11111101100000000000000000000000
11111011000000000000000000000000
11110110000000000000000000000000
11101100000000000000000000000000
11011000000000000000000000000000
10110000000000000000000000000000
01100000000000000000000000000000
11000000000000000000000000000000
10000000000000000000000000000000
11111111111111111111111111111011

此外,根据上面的代码,我们还可以经过测试得出

  • int 类型位移32位、64位还是它本身
  • long 类型位移64位还是它本身

原码&反码&补码

看上面的输出可能会有疑问
整型正数5的二进制是00000000 00000000 00000000 00000101
整型负数5的二进制是10000000 00000000 00000000 00000101
那为什么上文中对于-5的二进制输出是11111111 11111111 11111111 11111011呢?

先公布一下答案:这里输出的都是补码,计算机是使用补码做计算的。

下面详细解释为什么使用补码


计算机中只计算加法

  • 减法可以化为加法:比如5-4转化为5+(-4)
  • 乘法可以转化为加法和位移算法
  • 除法可以先转化为乘法再转化

只算加法简化了电路的设计

但是在二进制运算下,一个正数加上其相反数并不等于0,比如0000 0001 + 1000 0001 = -2

因此出现了反码,而数字本身我们叫做原码

  • 正数的反码是它本身
  • 负数的反码是:符号位不变,其他位取反,比如-5的反码是11111111 11111111 11111111 11111010

反码存在的问题:

  • 比如5 + (-5) = 0,二进制是00000000 00000101 + 11111111 11111010 = 11111111 11111111 全1表示0(负0)
  • 0 + 0 = 0,二进制00000000 00000000全0也表示0(正0)

还有更好的方案吗?答案就是补码

  • 正数的补码是本身
  • 负数的补码是反码+1,例如-5的补码是11111111 11111111 11111111 11111011上文提到过

补码只有全0表示0一种情况,相比反码又简化了电路的设计


参考下面的代码:

public void test02() {
    int num = 5;
    System.out.println("正数5的补码是原码本身");
    print(num);
    System.out.println("正数5取反就是其相反数-5的反码");
    print(~num);
    System.out.println("-5用补码表示,是反码+1");
    print(-num);
}

输出:

正数5的补码是原码本身
00000000000000000000000000000101
正数5取反就是其相反数-5的反码
11111111111111111111111111111010
-5用补码表示,是反码+1
11111111111111111111111111111011

扩展:整型的最大值和最小值

@Test
public void test03() {
    System.out.println("整型最大值是正 2的31次方-1 补码就是其本身");
    print(Integer.MAX_VALUE);
    System.out.println();
    System.out.println("整型最小值的补码");
    print(Integer.MIN_VALUE);
    System.out.println("补码取反");
    print(~Integer.MIN_VALUE);
    System.out.println("补码取反+1 就是整型最小值的相反数 即2的31次方 因此整型最小值是负 2的31次方");
}

输出:文章来源地址https://www.toymoban.com/news/detail-643130.html

整型最大值是正 2的31次方-1 补码就是其本身
01111111111111111111111111111111

整型最小值的补码
10000000000000000000000000000000
补码取反
01111111111111111111111111111111
补码取反+1 就是整型最小值的相反数 即2的31次方 因此整型最小值是负 2的31次方

到了这里,关于DAY001_二进制运算的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 深入解析位运算算法:探索数字的二进制秘密

    位运算是计算机科学中的重要概念,用于在二进制数字层面进行各种操作。本文将深入介绍位运算的基本操作,以及它在判断、计算和处理数字中的应用,包括判断2的幂次方、位图法、位掩码和寻找缺失数字等。 位操作是通过对数字的二进制表示进行操作,实现各种功能。

    2024年02月11日
    浏览(34)
  • ( 位运算 ) 190. 颠倒二进制位 ——【Leetcode每日一题】

    难度:简单 颠倒给定的 32 位无符号整数的二进制位。 提示: 请注意,在某些语言(如 Java )中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是

    2024年02月03日
    浏览(28)
  • 二进制概述-0day漏洞利用原理(1)

    二进制利用基本原理, Lord PE的使用, 凡是资源性的物质且可表达的皆可利用。 往期文章: 漏洞概述-0day漏洞利用原理(0)_luozhonghua2000的博客-CSDN博客  PE 文件格式  PE (Portable Exec utable) 是 Win32 平台下可执行文件遵守的数据格式。常见的可执行文件(如“*.exe”文件和“*.dll”文

    2024年02月07日
    浏览(32)
  • 【FPGA】Verilog:二进制并行加法器 | 超前进位 | 实现 4 位二进制并行加法器和减法器 | MSI/LSI 运算电路

    0x00 并行加法器和减法器 如果我们要对 4 位加法器和减法器进行关于二进制并行运算功能,可以通过将加法器和减法器以 N 个并行连接的方式,创建一个执行 N 位加法和减法运算的电路。 4 位二进制并行加法器 4 位二进制并行减法器

    2024年02月05日
    浏览(42)
  • 码出高效_第一章 | 有意思的二进制表示及运算

    设想有8条电路,每条电路有高电平和低电平两种状态,即就有2 8 =256种不同的信号。假设其表示区间为0~255,最大数即2 8 -1。 那么32条电路能够表示最大数为(2 32 -1)=4294967295,即所谓的32位电路信号。 正负数表示: 上面的8条电路,最左侧一条表示正负:0-整数,1-负数,不

    2024年02月06日
    浏览(25)
  • 关于二进制的原码、补码和反码,以及表示范围、常见位运算符和进制转换的理解与简述

    【版权声明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) https://www.cnblogs.com/cnb-yuchen/p/17963363 出自【进步*于辰的博客】 参考笔记一,P3.13、P5.1;笔记三,P43.1/3、P44.1。 注:我暂且没有整理关于二进制、原码、补码和反码等概念的理论,本文中的阐述都基于

    2024年02月02日
    浏览(37)
  • (位运算) 1356. 根据数字二进制下 1 的数目排序 ——【Leetcode每日一题】

    难度:简单 给你一个整数数组 arr 。请你将数组中的元素按照其二进制表示中数字 1 的数目升序排序。 如果存在多个数字二进制中 1 的数目相同,则必须将它们按照数值大小升序排列。 请你返回排序后的数组。 示例 1: 输入 :arr = [0,1,2,3,4,5,6,7,8] 输出 :[0,1,2,4,8,3,5,6,7] 解释

    2024年02月12日
    浏览(30)
  • 剑指 Offer 15. 二进制中1的个数 / LeetCode 191. 位1的个数(位运算)

    链接:剑指 Offer 15. 二进制中1的个数;LeetCode 191. 位1的个数 难度:简单 编写一个函数,输入是一个无符号整数(以二进制串的形式),返回其二进制表达式中数字位数为 ‘1’ 的个数(也被称为汉明重量)。 提示: 请注意,在某些语言(如 Java)中,没有无符号整数类型。

    2024年02月12日
    浏览(25)
  • C#的几种位操作运算,与、或、非、异或、左移、右移

    C#的常见几种位操作运算,与($)、或(|)、非(~)、异或(^)、左移()、右移() 位操作一般来说比加减乘除计算要快一些 与()操作符的位都为1时,才为1,其他都为0,因此与()操作符的结果范围在[0, Math.Min(x,y)],x,y均为正整数 或(|)操作符的位都为0时,才为0,其他都为1,因此或(|)操作

    2024年02月16日
    浏览(28)
  • C语言:位运算符----与(&),或(|),非(~),异或(^),左移(<<)和右移(>>)

    C语言 基础开发----目录 位运算符 就是按二进制位进行运算。 C语言中位运算符主要包括六种,具体如下: 与(),或(|),非(~),异或(^),左移()和右移() 位运算符 含义 说明 按位 与 有0为0,双1为1: 11=1,10=0,01=0,00=0 只有两者对应位都为 1 ,结果对应位才为 1 ,否则为 0 I 按

    2024年01月18日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包