写点什么

有一种爱情是逢二便可进位的二进制哦。

作者:ioik
  • 2022 年 8 月 05 日
  • 本文字数:3745 字

    阅读完需:约 12 分钟

有一种爱情是逢二便可进位的二进制哦。

美美的七夕节


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

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

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


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

不过,有关系嘛,

没有关系。

可是......

今天学的东西也好甜呀。

期待的二进制来了

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

计算机只认识二进制哦。

二进制(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 进制大家是不是就很熟悉了。再来看一下他们的对应形式


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

例:

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

128+64+16+4+1 = 213


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


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

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 进制:可以把二进制数每四位数分为一段,每一段用一个十六进制数来表示。


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);//-1
System.out.println(min-1);//2147483647System.out.println(max+1);//-2147483648 其实溢出的数也是有规律的。
复制代码

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

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

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

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


int q=-1;System.out.println(Integer.toBinaryString(q));//11111111111111111111111111111111int d=-2;System.out.println(Integer.toBinaryString(d));//11111111111111111111111111111110int a=0;Systeem.out.println(Integer.toBinaryString(a));//0  高位0省略了
复制代码


补码对称现象

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

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

0110(2)------61001(2)------ -7-6=-7+1-n =~n+1;
int i=8;System.out.println(~i);//-9
复制代码


神秘的运算符

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


与运算:&

逻辑乘法

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

计算规则

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


经典应用

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

int n1=0x632637de;int n2=0xff;int n3=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
拆分数据int n4=(n1>>>8)&n2;int n5=(n1>>>16)&n2;int n6=(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


经典应用

可以将将字节数据合并

int b1=0x9d;int b2=0x6f;int b3=0xef;int b4=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));//00110011
int b5=(b1<<24)|(b2<<16)|(b3<<8)|b4;System.out.println(Integer.toBinaryString(b5));//10011101 01101111 11101111 00110011
复制代码

右移位运算符:>>>

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

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

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

n=00111101 00011001 11001001 01011011m=n>>>1m=000111101 00011001 11001001 0101101k=n>>>2k=0000111101 00011001 11001001 010110
int s=0x3d19c95b;int g=s>>>1;int w=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 01010110
int a1=-36;int a2=a1>>>2;int a3=a1>>2;int a4=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,高位溢出舍弃。

int f=10;int t=f<<1;int y=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,也就是只有双方哦。看到这,你是不是也羡慕了呢。在这里也祝友友们早点拥有自己的二进制爱情哦。


发布于: 刚刚阅读数: 4
用户头像

ioik

关注

还未添加个人签名 2022.08.03 加入

还未添加个人简介

评论

发布
暂无评论
有一种爱情是逢二便可进位的二进制哦。_爱情_ioik_InfoQ写作社区