IT人才知道的二进制爱情,羡慕ing

简介: 二进制的爱情也太甜了,快来看看吧,同时祝友友们也早早得拥有自己的二进制爱情吧。

美美的七夕节

2.jpg


首先祝友友们节日快乐呀!!!

缘分,就是一个奇数,等待另一个奇数,来组成一个偶数。七夕佳节,愿还是奇数的你,早日脱单;已是偶数的你,幸福甜蜜!

七夕节,又称七巧节、七姐节、女儿节、乞巧节、七娘会、七夕祭、牛公牛婆日、巧夕等,是中国民间的传统节日。七夕节由星宿崇拜衍化而来,为传统意义上的七姐诞,因拜祭“七姐”活动在七月七晩上举行,故名“七夕”。拜七姐,祈福许愿、乞求巧艺、坐看牵牛织女星、祈祷姻缘、储七夕水等,是七夕的传统习俗。经历史发展,七夕被赋予了“牛郎织女”的美丽爱情传说,使其成为了象征爱情的节日,从而被认为是中国最具浪漫色彩的传统节日,在当代更是产生了“中国情人节”的文化含义。


不过,在美美的七夕节这几天里,我想还有着不少友友在和我一样,还在老老实实搬砖吧。

4.jpg

不过,有关系嘛,

没有关系。

可是......

今天学的东西也好甜呀。

5.jpg

期待的二进制来了

      最早的编程语言是二进制语言,也是计算机能够直接识别的唯一语言。不管用什么高级语言编写的程序最后都要转换为二进制语言,才能在计算机上执行。

计算机只认识二进制哦。

image.png

二进制(binary),发现者莱布尼茨,是在数学和数字电路中以 2 为基数的记数系统,是以 2 为基数代表系统的二进位制。这一系统中,通常用两个不同的符号 0(代表零)和 1(代表一)来表示。

十进制是组成以 10 为基础的数字系统,有 0,1,2,3, 4, 5, 6, 7, 8, 9 十个基本数字组成。

十六进制(简写为 hex 或下标 16)是一种基数为 16 的计数系统,是一种逢 16 进 1 的进位制。通常用数字 0、1、2、3、4、5、6、7、8、9 和字母 A、B、C、D、E、F(a、b、c、d、e、f)表示,其中:A~F 表示 10~15,这些称作十六进制数字


大家可能会有疑惑,二进制?就是那一串 01101010......的数字嘛,可是我们在计算机中也很少见呀。

的确,一般我们在计算机中看到的采用的都是 10 进制,16 进制等


2 进制                     10 进制                             16 进制

逢二进一                  逢十进一                          逢十六进一

数字: 01                   数字: 0123456789            数字: 0123456789ABCDEF

权:  ......8 4 2 1          权: ...... 1000 100 10 1    权:  ........16 1

基数 2                      基数 10                            基数:16


看到 10 进制大家是不是就很熟悉了。再来看一下他们的对应形式

6.jpg

2 进制转换为 10 进制:将一个 2 进制数每个 1 位置的权值累加即可

例:

11010101(2)-------213(10)

128+64+16+4+1   =  213


10 进制转 2 进制:“除以 2 取余,逆序排列”(除二取余法)

8.jpg


在这里,大家还可以使用相减权的方法来进行转换。

                   128     64    32     16    8      4     2     1   (10)

                      1       1     0        0     0      1     0     0   (2)

                     68      4                              0

196(10)=  11000100(2)


2 进制转换为 16 进制:可以把二进制数每四位数分为一段,每一段用一个十六进制数来表示。

3.jpg


0101 1111(2)----64+16+8+4+2+1=95

5f(16)----------------5*16+15=95


在计算机采用 16 进制就是用于简写 2 进制(缩写 2 进制),因为 2 进制的书写过于冗长,而 2 进制的每 4 位对应一个 16 进制。


计算机中使用的都是二进制,八进制和十六进制的出现其实都不是计算机的需要,它们的出现完全是出于表达和识别的方便性考虑的。

一个较大的数用二进制表示就太长了,比如一个 int 类型的 100(4 个字节,总共 32 位),用二进制表示就是 0000 0000 0000 0000 0000 0000 0110 0100,这还是一个比较小的数,如果更大,将会更复杂,写这么长,确实有些不便,于是,就出现了更简易的八进制,十进制,十六进制,数制越大,表示一个数所需的数码位数就越少,所以 C 和 C++代码中不能直接输入二进制,但是允许输入八进制、十进制、十六进制。

那为什么没有出现什么七进制,九进制呢?因为 8,16 分别是 2 的 3 次方、4 次方。使得这 3 种进制之间转换起来很方便。

八进制、十六进制即缩短了数的表示位数,同时保持了二进制数的表达特点。

-----引用自王达老师《深入理解计算机网络》


说到这里就不得不提一下补码,取反的相关知识。。


补码

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。


补码的规律:

1. 0 是 0000 0000 0000 0000 0000 0000 0000 0000

2. -1 是 1111 1111 1111 1111 1111 1111 1111 1111

3.max 是 0111 1111 1111 1111 1111 1111 1111 1111

4.min 是 1000 0000 0000 0000 0000 0000 0000 0000

System.out.println(min-max);
//1  最大值加一 是最小值;最小值减一是最大值;System.out.println(max-min);//-1System.out.println(min-1);//2147483647System.out.println(max+1);//-2147483648  溢出的数也是有规律的。

复制代码

在这里以 4 位 2 进制为例讲解补码的编码规则:

(1)计算的时候如果超出 4 位数,就自动溢出舍弃,保持 4 位数不变。

(2)将 4 位 2 进制数分一半作为使用负数使用,0 在计算机中作为正数。

(3)最高位称为符号位,高位为 0 是正数,高位为 1 是负数。

11.jpg


intq=-1;
System.out.println(Integer.toBinaryString(q));
//11111111111111111111111111111111intd=-2;
System.out.println(Integer.toBinaryString(d));
//11111111111111111111111111111110inta=0;
Systeem.out.println(Integer.toBinaryString(a));//0  高位0省略



补码对称现象

12.jpg

公式:-n=~n+1   一个数的补码=这个数取反+1(取反(二进制数 0 变 1,1 变 0))

(正负都有效,除了最小值,最小值还是他本身)

0110(2)------61001(2)-------7-6=-7+1-n=~n+1;
inti=8;
System.out.println(~i);//-9



神秘的运算符

二进制中包含了 &,| ,>>>,<<, ~等多种运算符。


与运算:&

逻辑乘法

1&1=1;0&1=0;1&0=0;0&0=0;

计算规则

两个数上下对齐,对齐位数进行与运算。


经典应用

掩码(mask)运算(截取一个数的后 8 位)

intn1=0x632637de;
intn2=0xff;
intn3=n1&n2;
System.out.println(Integer.toBinaryString(n1));
//01100011 00100110 00110111 11011110System.out.println(Integer.toBinaryString(n2));
//00000000 00000000 00000000 11111111System.out.println(Integer.toBinaryString(n3));
//11011110拆分数据intn4=(n1>>>8)&n2;
intn5=(n1>>>16)&n2;
intn6=(n1>>>24)&n2;
System.out.println(n4);//55System.out.println(Integer.toBinaryString(n4));//00110111System.out.println(n5);//38System.out.println(Integer.toBinaryString(n5));//00100110System.out.println(n6);//99System.out.println(Integer.toBinaryString(n6));//01100011



或运算:|

两者都为 0 为 0,否则为 1

1 | 1 = 1,       1 | 0= 1,    0 | 1 = 1,    0 | 0 = 0


经典应用

可以将将字节数据合并

intb1=0x9d;
intb2=0x6f;
intb3=0xef;
intb4=0x33;
System.out.println(Integer.toBinaryString(b1));//10011101System.out.println(Integer.toBinaryString(b2));//01101111System.out.println(Integer.toBinaryString(b3));//11101111System.out.println(Integer.toBinaryString(b4));//00110011intb5=(b1<<24)|(b2<<16)|(b3<<8)|b4;
System.out.println(Integer.toBinaryString(b5));
//10011101 01101111 11101111 00110011


右移位运算符:>>>

运算规则 将数字向右移动,高位补充 0,低位溢出舍弃

>>>向右移动,高位永远补 0;

>>数位向右移动,高位为 1(负数)则补 1;高位为 0(正数)则补 0,保持符号位不变,其结果符合数学除法规律(自动向小方向取整)

n=00111101000110011100100101011011m=n>>>1m=00011110100011001110010010101101k=n>>>2k=00001111010001100111001001010110ints=0x3d19c95b;
intg=s>>>1;
intw=s>>>2;
System.out.println(Integer.toBinaryString(s));
//00111101 00011001 11001001 01011011System.out.println(Integer.toBinaryString(g));
//00011110 10001100 11100100 10101101System.out.println(Integer.toBinaryString(w));
//00001111 01000110 01110010 01010110inta1=-36;
inta2=a1>>>2;
inta3=a1>>2;
inta4=a1>>3;
System.out.println(a2);//1073741815System.out.println(a3);//-9System.out.println(a4);//-5System.out.println(Integer.toBinaryString(a1));
//11111111111111111111111111011100System.out.println(Integer.toBinaryString(a2));
//00111111111111111111111111110111System.out.println(Integer.toBinaryString(a3));
//11111111111111111111111111110111



左移位运算符:<<

将数字向左移动,低位补充为 0,高位溢出舍弃。

intf=10;
intt=f<<1;
inty=f<<2;
System.out.println(f);//10System.out.println(t);//20System.out.println(y);//40


非运算:~

1 取 0    0 取 1

~1 = 0       ~ 0 = 1

~(1001) = 0110


小彩蛋

    看到文章这里,是不是对于二进制已经有了不错的理解了,而且不知道你有没有发现不论在哪种情况下,1 和 0 这一对就从未分开过,属实甜到了。而且在“二进制”的爱情中,他们的感情只有 0 和 1,也就是只有双方哦。看到这,你是不是也羡慕了呢。在这里也祝友友们早点拥有自己的二进制爱情哦。

13.jpg


目录
相关文章
|
人工智能 vr&ar 图形学
开源单图生成3D模型TripoSR的局限性分析
【2月更文挑战第25天】开源单图生成3D模型TripoSR的局限性分析
673 6
开源单图生成3D模型TripoSR的局限性分析
|
机器学习/深度学习 自然语言处理 数据处理
零样本学习的易懂解释
零样本学习是一种机器学习的方法,它的目标是在没有任何标记样本的情况下,通过学习从未见过的类别或任务。这意味着模型需要在没有任何先验知识的情况下进行学习和推理。
572 0
|
缓存 JSON tengine
CDN 预热功能| 学习笔记
快速学习 CDN 预热功能。
【资源分享】阿里云盘资源永久汇总页
不知道大家的阿里云盘现在有多少容量了?阿里为了资源也为了网盘活跃度,在九月推出限时活动,分享赢10T容量。因此带来了这一波的阿里盘分享热潮,当然大部分人都是奔着10T去的。所以网上资源翻来覆去的很多,重复的也多。正因如此空空发现了一位网友非常的有心,将分享出来网盘资源进行了梳理汇总,并且搭建了这个终极阿里云盘资源整合网站——【阿里云盘资源永久汇总页】。
245852 11
【资源分享】阿里云盘资源永久汇总页
|
编解码 算法 ice
Google Earth Engine ——MCD19A2 V6数据产品是MODIS Terra和Aqua结合的大气校正多角度实施(MAIAC)陆地气溶胶光学深度(AOD)网格化2级产品,1公里分辨率
Google Earth Engine ——MCD19A2 V6数据产品是MODIS Terra和Aqua结合的大气校正多角度实施(MAIAC)陆地气溶胶光学深度(AOD)网格化2级产品,1公里分辨率
1272 0
Google Earth Engine ——MCD19A2 V6数据产品是MODIS Terra和Aqua结合的大气校正多角度实施(MAIAC)陆地气溶胶光学深度(AOD)网格化2级产品,1公里分辨率
|
存储 Ubuntu Linux
在Linux中,如何查看当前主机的主机名,如何修改主机名?要想重启后依旧生效,需要修改哪个配置文件?
在Linux中,如何查看当前主机的主机名,如何修改主机名?要想重启后依旧生效,需要修改哪个配置文件?
|
XML 前端开发 Android开发
Android:UI:Drawable:View/ImageView与Drawable
通过本文的介绍,我们详细探讨了Android中Drawable、View和ImageView的使用方法及其相互关系。Drawable作为图像和图形的抽象表示,提供了丰富的子类和自定义能力,使得开发者能够灵活地实现各种UI效果。View和ImageView则通过使用Drawable实现了各种图像和图形的显示需求。希望本文能为您在Android开发中使用Drawable提供有价值的参考和指导。
302 2
|
关系型数据库 MySQL 分布式数据库
PolarDB MySQL版 GDN:实现真正的全球异地多活
【7月更文第31天】随着全球化业务的发展,企业需要确保其数据库能够在不同地理位置之间提供一致的服务质量和高可用性。阿里云PolarDB MySQL版的全球数据库网络(GDN)功能为此类需求提供了一个理想的解决方案。本文将深入探讨PolarDB MySQL版在GDN下的表现,并通过实际场景评测其异地多活能力。
545 3
|
存储 安全 Linux
|
移动开发 小程序 JavaScript
uni-app 搭建开发环境,创建项目,运行项目
uni-app 搭建开发环境,创建项目,运行项目
222 0