二进制的详细理解

二进制

  什么是2进制

      逢2进1的计数规则

   2进制
   规则:逢2进1
   数字:0 1 
   权:128 64 32 16 8 4 2 1
   基数:2

10进制计数规则

  10进制
  规则:逢10进1
  数字:0 1 2 3 4 5 6 7 8 9
 权:万 千 百 十 个
 基数:10

计算机为啥是2进制?便宜!!!成本优势明显!!!

如何将2进制转换为10进制:将1位置对应权值累加求和


00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000001 = 1
00000000 00000000 00000000 00000010 = 2
00000000 00000000 00000000 00000011 = 2+1 = 3
00000000 00000000 00000000 00000100 = 4
00000000 00000000 00000000 00000101 = 4+1 = 5
00000000 00000000 00000000 00000110 = 4+2 = 6
00000000 00000000 00000000 00000111 = 4+2+1=7
00000000 00000000 00000000 00001000 = 8
00000000 00000000 00000000 00001001 = 8+1=9
00000000 00000000 00000000 00001010 = 8+2=10
00000000 00000000 00000000 00001011 = 8+2+1=11
00000000 00000000 00000000 00001100
00000000 00000000 00000000 00001101
00000000 00000000 00000000 00001110
00000000 00000000 00000000 00001111
00000000 00000000 00000000 00010000

00000000 00000000 00000000 00011001 = 16+8+1=25

00000000 00000000 00000000 01101000 = 64+32+8=104

package binary;

public class Demo01 {
    public static void main(String[] args) {
        /*
         * 如何查看整数的2进制存储情况
         * - java 编译时候,将数字编译为2进制数字
         * - 运行期间变量中存储的是2进制数
         * - 输出变量时候,Java利用API方法,将2进制转换为10进制字符串
         *   利用valueOf方法转换!
         * - Integer.toBinaryString(n) 将整数n在内存中2进制情况显示出来
         */
        int n = 50; //n=110010
        System.out.println(n); //利用valueOf转换2进制为10进制字符串输出
        System.out.println(Integer.toBinaryString(n));

        System.out.println(Integer.toBinaryString(104));
        /*
         * 输出0~200的2进制, 手工计算20个数的10进制值,编程验证
         */
        for(int i=0; i<200; i++){
            System.out.println(Integer.toBinaryString(i));
        }
    }
}

 什么是16进制

   逢16进1的计数规则。

  16进制用途:16进制用于缩写2进制。

  - 2进制书写非常繁琐
  - 16进制的基数是2进制的基数4次方, 2进制每4位数可以缩写为1个16进制数。


package binary;

public class Demo02 {
    public static void main(String[] args) {
        /*
         * 2进制与16进制
         * - Java7 提供了2进制字面量前缀 0b
         *   可以在数字中添加下划线,不影响数值
         * - 2进制直接书写非常繁琐
         * - 16进制缩写2进制就非常方便
         *   从2进制的最低位开始, 每4位数缩写为1位16进制数
         * - 0x是16进制的前缀
         * - 计算内部没有10进制,没有16进制,只有2进制!
         */
        int n = 0b11_0010;//32+16+2=50
        System.out.println(n);
        n = 0b0001_1001_1111_0001_0100_0011_1111_0101;
        //    1    9    f    1    4    3    f    5
        System.out.println(Integer.toBinaryString(n));
        n = 0x19f143f5;
        System.out.println(Integer.toBinaryString(n));
        long l = 0b10111111111111111111111111111111111111L;
    }
}

补码

计算中一种表示有符号数编码,其核心思想就是将固定位数2进制分一般作为负数。

如何将固定位数2进制分一半作为负数?

   - 以4位2进制数讲解如何设计补码
  - 计算时候保持4位不变, 多余位自动溢出
  - 最高位称为符号位,0是正数,1是负数


package binary;

public class Demo03 {
    public static void main(String[] args) {
        /*
         * 补码
         * max 最大
         * value 值
         * Integer 整数
         */
        int n = -3;
        System.out.println(Integer.toBinaryString(n));
        int max = Integer.MAX_VALUE;
        int min = Integer.MIN_VALUE;
        System.out.println(max);
        System.out.println(min);
        System.out.println(Integer.toBinaryString(max));
        System.out.println(Integer.toBinaryString(min));
        System.out.println(Integer.toBinaryString(-1));
        System.out.println(Long.toBinaryString(-1L));
    }
}

手工计算负数的值: 计算这个数比-1少0位置的权。


11111111111111111111111111111111 = -1
11111111111111111111111111111101 = -1-2=-3
11111111111111111111111111111001 = -1-2-4=-7
11111111111111111111111111111000 = -1-1-2-4=-8
11111111111111111111111101101011 = -1-4-16-128=-149
11111111111111111111111101101100 = -1-1-2-16-128=-148

package binary;

public class Demo04 {
    public static void main(String[] args) {
        /*
         * 负数的编码
         * 实验: 输出-200到0的2进制编码(补码)
         *    随机选取20个数,手动计算10进制值
         *    利用Java程序验算计算结果。
         */
        for(int i=-200; i<0; i++){
            System.out.println(Integer.toBinaryString(i));
        }
    }
}

long类型负数补码


1111111111111111111111111111111111111111111111111111111111111111 = -1
1111111111111111111111111111111111111111111111111111111111100110 =-26

互补对称现象:-n = ~n+1


-7    = 11111111 11111111 11111111 11111001 = -1-2-4=-7
~-7   = 00000000 00000000 00000000 00000110 = 2+4 = 6
~-7+1 = 00000000 00000000 00000000 00000111 = 1+2+4=7
    
54    =00000000 00000000 00000000 00110110= 2+4+16+32=54
~54   =11111111 11111111 11111111 11001001=-1-2-4-16-32=-55
~54+1 =11111111 11111111 11111111 11001010=-1-1-4-16-32=-54

代码:


public class Demo05 {
    public static void main(String[] args) {
        /*
         * 验证补码的互补对称现象 -n=~n+1
         */
        System.out.println(54);
        System.out.println(Integer.toBinaryString(54));
        System.out.println(~54);
        System.out.println(Integer.toBinaryString(~54));
        System.out.println(~54+1);
        System.out.println(Integer.toBinaryString(~54+1));
    }
}

2进制运算

  运算符号:


~ 取反
& 与
| 或运算
>>> 右移位运算
>> 数学右移位运算
<< 左移位运算

`&` 与运算

运算规则:逻辑乘法 有0则0


0 & 0 -> 0
0 & 1 -> 0
1 & 0 -> 0
1 & 1 -> 1

运算时候将两个2进制数对其位,对应位置进行与运算

栗子:


        1   7    9   d    5   d    9   e 
n   =   00010111 10011101 01011101 10011110
m   =   00000000 00000000 00000000 11111111  8位掩码
k=n&m   00000000 00000000 00000000 10011110

如上运算的意义:k中存储的是n的最后8位数,如上运算叫掩码(mask)运算。m称为mask(掩码),一般从低位开始1的个数称为掩码的位数。

代码:


int n = 0x179d5d9e;
int m = 0xff;
int k = n & m;

package binary;

import java.util.ArrayList;

public class Demo06 {
    public static void main(String[] args) {
        /*
         * 掩码运算
         */
        int n = 0x179d5d9e;
        //4位掩码:0xf 0b1111 15
        //6位掩码:0x3f 0b111111 63
        //8位掩码:0xff 0b11111111 255
        int m = 0xff; //4位 6位 8位 16位
        int k = n & m;
        System.out.println(Integer.toBinaryString(n));
        System.out.println(Integer.toBinaryString(m));
        System.out.println(Integer.toBinaryString(k));

    }
}

`>>>` 右移位运算

 运算规则, 将2进制数整体向右移动,低位自动溢出舍弃,高位补0


n    =   01100111 11010111 10001111 01101101
m=n>>>1  001100111 11010111 10001111 0110110
k=n>>>2  0001100111 11010111 10001111 011011
g=n>>>8  00000000 01100111 11010111 10001111 
b3 = (n>>>8) & 0xff;

代码:


int n = 0x67d78f6d;
int m = n>>>1;
int k = n>>>2;
int g = n>>>8;
int b3 = (n>>>8) & 0xff;
//按照2进制输出 n m k g b3
```

 | 或运算

 //基本运算规则:逻辑加法, 有1则1

0 | 0 -> 0
0 | 1 -> 1
1 | 0 -> 1
1 | 1 -> 1

 运算时候两个2进制数对齐位,对应位进行或运算

栗子:


n  =     00000000 00000000 00000000 11011101
m  =     00000000 00000000 10011101 00000000
k=n|m    00000000 00000000 10011101 11011101

上述计算的意义: 两数错位合并

代码:


int n = 0xdd;
int m = 0x9d00;
int k = n | m;
//检查 n m k 的2进制

 `<<` 左移位运算

 2进制数字整体向左移动,高位自动溢出,低位补0

栗子:


n  =    00100000 11101111 00110101 10010000
m=n<<1  0100000 11101111 00110101 100100000
k=n<<2  100000 11101111 00110101 1001000000
g=n<<8  11101111 00110101 10010000 00000000

代码:


int n = 0x20ef3590;
int m = n<<1;
int k = n<<2;
int g = n<<8;
//按照2进制输出 n m k g

移位运算的数学意义

栗子:


      16 8 4 2 1
           1 0 1 = 5
         1 0 1   = 10    向左移动1位  *2
       1 0 1     = 20    向左移动2位  *2*2

代码:


int n = 5;
System.out.println(n<<1); //10
System.out.println(n<<2); //20
System.out.println(n<<3); //40

 `>>>` 和 `>>` 的区别

   - `>>>` 逻辑右移位:数字向右移动,低位自动溢出,高位补0, 结果没有数学意义。如果仅仅将数位向右移动,不考虑数学意义,则使用`>>>`
   - `>>` 数学右移位:数学向右移动,低位自动溢出,正数高位补0,负数高位补1,  移动一次数学除以2,小方向取整数。如果是替代数学 /2, 使用数学右移位。

栗子, 使用负数比较运算结果:


n  =   11111111 11111111 11111111 11001100=-1-1-2-16-32=-52
m=n>>1 111111111 11111111 11111111 1100110=-1-1-8-16=-26
k=n>>2 1111111111 11111111 11111111 110011=-1-4-8=-13
g=n>>3 11111111111 11111111 11111111 11001=-1-2-4=-7
n>>>1  011111111 11111111 11111111 1100110=max-25没有数学意义

程序:


int n = -52; //0xffffffcc;
int m = n>>1;
int k = n>>2;
int g = n>>3;
int x = n>>>1;
//输出n m k g x 

### 将一个整数拆分为4个字节

栗子


            b1       b2       b3       b4
n   =    00010111 10011101 01011101 10011110
b1  =    00000000 00000000 00000000 00010111 
b2  =    00000000 00000000 00000000 10011101
b3  =    00000000 00000000 00000000 01011101  
b4  =    00000000 00000000 00000000 10011110

代码:n =-1   n=-3   n=max  n=min


int n = 0x179d5d9e;
int b1 = (n >>> 24) & 0xff;
int b2 = (n >>> 16) & 0xff;
int b3 = (n >>> 8) & 0xff;
int b4 = n & 0xff;
//验证:按照二进制输出 n b1 b2 b3 b4
//n=-1 时候按照10进制输出是啥结果?

### 将4个字节合并为一个整数


b1  =    00000000 00000000 00000000 00010111 
b2  =    00000000 00000000 00000000 10011101
b3  =    00000000 00000000 00000000 01011101  
b4  =    00000000 00000000 00000000 10011110

b1<<24   00010111 00000000 00000000 00000000 
b2<<16   00000000 10011101 00000000 00000000 
b3<<8    00000000 00000000 01011101 00000000 
b4       00000000 00000000 00000000 10011110

n = (b1<<24) | (b2<<16) | (b3<<8) | b4;

 代码:


int b1 = 0x17;
int b2 = 0x9d;
int b3 = 0x5d;
int b4 = 0x9e;
int n = (b1<<24) | (b2<<16) | (b3<<8) | b4;
//按照2进制输出 b1 b2 b3 b3 n

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/330329.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【图形学】探秘图形学奥秘:图形变换的解密与实战

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《图形学 | 图像解码》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 ​ 目录 &#x1f30c;1. 初识模式识别…

khbc靶场小记(upload 666靶场)

尝试上传正常的png jpg gif php的格式的文件发现老是提示烦人的消息&#xff08;上传不成功&#xff09;&#xff1b; 通过抓包对MIME进行爆破没爆出来&#xff0c;当时可能用成小字典了&#xff1b; 猜测可能是把后缀名和MIME绑定检测了&#xff1b; 反正也没思路&#xff0c;…

CentOS8搭建NFS服务

一、服务端搭建——172.16.10.130 1.安装nfs,rpc服务 yum install -y rpcbind yum install -y nfs-utils2.创建共享目录 test1共享目录 mkdir /home/nfs/disk-test1 chmod 777 /home/nfs/disk-test1test2共享目录 mkdir /home/nfs/disk-test2 chmod 777 /home/nfs/disk-test…

ERROR: xtensa-Ix106-elf-gdb.exe not found!

问题&#xff1a; 我们使用ESP Eexception Decorder时候&#xff0c;报错找不到xtensa-Ix106-elf-gdb.exe执行文件&#xff0c;其实我们注意看输出 显示&#xff1a;gdbPath: C:\Users\TTJ2023\AppData\Local\Arduino15\packages\esp32\tools\xtensa-esp-elf-gdb\11.2_2022082…

算法练习-长度最小的子数组(思路+流程图+代码)

难度参考 难度&#xff1a;简单 分类&#xff1a;数组 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。以下内容均为个人笔记&#xff0c;旨在督促自己认真学习。 题目 给定一个含有个正整数的数组和一个正整数s&#xff0c;找…

用CHAT分析高校体育智慧教学体系构建与探索研究现状

CHAT回复&#xff1a;现阶段&#xff0c;高校体育智慧教学体系的构建与探索研究还处于初级阶段&#xff0c;但全球数字化转型大潮的推动下&#xff0c;一些较为前沿的研究和实践已经开始出现&#xff1a; 1.教学平台的建设&#xff1a;很多高校已经开始尝试使用在线教育平台进行…

锂离子电池二阶RC等效电路模型参数

目前锂离子电池二阶RC等效电路模型是较多学者进行研究的模型&#xff0c;不同的锂离子电池模型参数有差别&#xff0c;但大致在这个范围内&#xff0c;可参考。 等效电路模型&#xff1a; 部分文献离线参数辨识结果&#xff1a; 另一文献的辨识结果&#xff1a;

e2studio开发三轴加速度计LIS2DW12(3)----检测活动和静止状态

e2studio开发三轴加速度计LIS2DW12.3--检测活动和静止状态 概述视频教学样品申请源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置UART配置UART属性配置设置e2studio堆栈e2studio的重定向printf设置R_SCI_UART_Open()函数原型回调函数user_uart_callback ()…

【刷题】 leetcode 2 .两数相加

两数相加 两数相加1 思路一 &#xff08;暴毙版&#xff09;2 思路二 &#xff08;本质出发&#xff09; 谢谢阅读Thanks♪(&#xff65;ω&#xff65;)&#xff89;下一篇文章见&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 两数相加 我们来看…

系统架构的演变:从单体到微服务的旅程

文章目录 前言一、单体架构简图 二、垂直架构简图 三、水平架构简图 四、面向服务架构&#xff08;SOA&#xff09;简图 五、微服务架构简图 总结 前言 随着信息技术的快速发展&#xff0c;系统架构也在不断演变。从早期的单体架构到现代的微服务架构&#xff0c;每一次的变革都…

Numpy的学习 第一课 了解以及使用

1.输入模式 1.编辑模式 绿色2.命令模式 蓝色 2.运行 直接输入jupyter notebook 3.文档注释 查看函数帮助文档命令 help(函数) 单问号与多问号 单问号显示文档 多问号显示文档代码 3.shifttab 显示参数 4.运行外部文件 %run 路径,可绝对可相对 这里运行了就相当于方法了,或者…

C++ 之LeetCode刷题记录(十二)

&#x1f604;&#x1f60a;&#x1f606;&#x1f603;&#x1f604;&#x1f60a;&#x1f606;&#x1f603; 开始cpp刷题之旅。 依旧是追求耗时0s的一天。 69. x 的平方根 示例 1&#xff1a; 输入&#xff1a;x 4 输出&#xff1a;2 示例 2&#xff1a; 输入&#x…

软件测试|使用Python轻松裁剪视频

简介 裁剪视频是在视频编辑和处理中常见的任务之一&#xff0c;Python提供了多种库和工具&#xff0c;可以用来裁剪视频。在本文中&#xff0c;我们将详细讨论如何使用Python来裁剪视频&#xff0c;并提供示例代码。 步骤1&#xff1a;环境准备 首先&#xff0c;我们要安装必…

交换机配置及网络测试

实验环境 拓扑图 Ip规划表 部门 主机数量 网络地址 子网掩码 网关 可用ip Vlan 市场部 38 192.168.131.0 255.255.255.0 192.168.131.1 2-254 11 研发部 53 192.168.132.0 255.255.255.0 192.168.132.1 2-254 12 财务部 9 192.168.133.0 255.255.255…

更适合3D项目的UI、事件交互!纯国产数字孪生引擎持续升级中!!!

UI和事件交互是3D可视化项目中最常见的模块&#xff0c;主要用于信息添加、展示&#xff0c;用来确保按照用户需求呈现内容并完成交互。 平时工作在进行UI和交互设计时&#xff0c;经常出现以下问题&#xff1a;UI过于复杂导致3D项目内交互效率低下&#xff0c;或者是结合3D项目…

重磅!鼎捷参与编写的《小灯塔企业数字化转型能力成熟度模型》团体标准发布

近日&#xff0c;由上海市计算机行业协会组织发起&#xff0c;鼎捷软件参与起草的《小灯塔企业数字化转型能力成熟度模型》团体标准正式发布。标准旨在共同推动业内标准的设定和完善&#xff0c;加快企业的数字化转型&#xff0c;助力产业快速发展。 作为业内专业的数字化转型服…

【第65例】IPD体系进阶:PDT跨职能团队

内容简介 这节内容主要来谈谈 IPD 体系中的一个关键跨职能团队(PDT)。 跨部门协作也是 IPD 中的一个核心思想。 这是因为创新和研发是全公司的行为。 接力棒式的产品开发流程是很难保证最终的产品质量。 在 IPD 体系中,无论是需求管理、产品和技术规划、项目任务书开发…

【技术分享】远程透传网关-单网口快速实现西门子S7-300/400 PLC程序远程上下载

准备工作 一台可联网操作的电脑一台单网口的远程透传网关及博达远程透传配置工具网线一条&#xff0c;用于实现网络连接和连接PLC一台西门子S7- 300/400 PLC及其编程软件一张4G卡或WIFI天线实现通讯(使用4G联网则插入4G SIM卡&#xff0c;WIFI联网则将WIFI天线插入USB口&#…

【架构】docker实现3主3从架构配置【案例1/4】

一&#xff0c;集群规划及准备工作 架构实现&#xff1a;Redis3主3从 二&#xff0c;搭建命令 第一步&#xff0c;创建6台服务&#xff1a; docker run -d --name redis-node-1 --net host --privilegedtrue -v /data/redis/share/redis-node-1:/data redis:6.0.8 --clust…

全球移动通信市场,正在经历哪些新变化?

2023年已经结束了。回顾这一年的全球移动通信市场&#xff0c;如果让我用一个词来总结&#xff0c;那就是——“厚积薄发”。 从表面上来看&#xff0c;似乎并没有什么大事情发生。但实际上&#xff0c;平静的湖面之下&#xff0c;却是一片波涛汹涌、风云激荡。 无论是消费互联…