一个英文字母(不分大写和小写)占一个字节的空间。一个中文汉字占两个字节的空间。
一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。
最小值0,最大值255。如一个ASCII码就是一个字节。
UTF-8编码:
一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。
Unicode编码:
一个英文等于两个字节,一个中文(含繁体)等于两个字节。
符号:
英文标点占一个字节,中文标点占两个字节。举例:英文句号“.”占1个字节的大小,中文句号“。
”占2个字节的大小。
异或运算表明:不要自我疑惑
绪言
本知识点可用于汇编语言、常见编程语言(脚本语言/面向对象过程语言/面向对象语言/函数式编程语言)、计算机组成原理、密码学等学科的基础学习.
20200103 二进制知识
常用换算
20200103 二进制知识
2^10 = 1024 = 10^3
1Word = 2Bytes = 16Bits(字,字节,位/比特)
“逢X进一”
权位,X^i
Binary二进制,B,0-1,2^k
Octal八进制,O,0-7,8^k
Decimal十进制,D,0-9,10^k
Hexadecimal十六进制,H,0-F,,16^k
Eg: 21H = 33D = 41O = 100001B进制转换
任意进制转十进制:“按权展开,相乘求和“”
十进制转任意进制:整数部分“除基数,取余数”,小数部分“乘基数,取整数(部分)”
二进制转八进制:“三位合一”
整数部分自右往左,小数部分从左往右,两端补齐(整数左补0,小数右补0)
八转二:“一位拆三”
二转十六:“四位合一”
十六转二:“一位拆四”
降幂法:减去权位值,“能减为1,不能减为0”
“8421”快速转化:32,64,128,256有无符号数
有符号数:
机器字长必定为2的整数倍,即可能取值为8,16,32,64
以8位为例,最左边第1位是正负符号位,后7位为数值位
速记结论:后七位权值总和比第八位权值(也就是最左边的第1位)小1,即
,其中n为机器字长
16位字长机器:2^15 = 32768
有符号数:数值划分为负数、0和正数,故2^16 / 2 = 2^15,且0是从正数部分抠出去的,
因而正数范围比复数范围少1
n位二进制补码的表数范围: ~
无符号整数的表数范围: 0 ~
符号位:0表示正,1表示负
原码:因符号位而有正负之分,0也有正负之分、因此0的表示不唯一
反码:正数反码同原码,负数反码要数值位取反,符号位不做变动,0的表示也不唯一
补码:正数补码同原码,负数补码除了最右边1位不变动,其余数值位取反,
符号位也不用动,补码0的表示唯一,都为完全0值
其他说法:
(1)写出正数的补码,“最左边的符号位由1(负)改0(正)即可”
(2)按位求反,“包括符号位和数值位”
(3)末位加一“逢2进1”
移码:不论正负,符号位与补码相反,数值位完全相同双符号位
数值溢出问题与双符号位制:
进位“逢2进1”,溢出
正数前边补0变双00,负数前边补1变双11
二进制数四则运算:
加:[X+Y] 补码= [X]补码+ [Y] 补码
减:加法化加法,即(此时需要求负数补码)
[X-Y] 补码= [X]补码+ [-Y] 补码
乘:符号位异或运算,数值位用并行乘法(器)
除:并行除法
规律总结如下:
对于正数:[X] 原码= [X]反码+ [X] 补码
正负0的补码(或移码)具有唯一表示,原码和反码表示并不唯一(符号位引起不同)逻辑运算
又叫按位运算(汇编上等价)
与AND, 标记为 ^ 或 · “同真才真1”
或OR, 标记为 ∨ 或 + “同假才假0”
非NOT, 标记为 ¬ 或 ~ 或 ’ “真假互变”
异或XOR,标记为 ∀ 或 ㊉ “相异为真1”
运算优先级:括号最高
NOT 运算符具有最高优先级,然后是 AND 和 OR 运算符
“单运算符优先级要比双运算符的高”ASCII码
常用知识
20200104 补充知识:
‘A’ 65Dec = 41Hex
‘a’ 97Dec = 61Hex
字母大小写互换:±32
‘0’ 48D = 30H
(space),空格 32D = 20H = 0x20
CR (carriage return),回车 13D = 0DH = 0x0D
LF (NL line feed, new line),换行键 11D = 0AH = 0x0A
NUL(null),空字符 0000 0000,0D = 0x00
ESC (escape),换码(溢出) 0001 1011,27 = 0x1B总结规律
ASCII码值由小到大的排列顺序:空格字符、数字符、大写英文字母、小写英文字母
各国编码不同:
0–127表示的符号是一样的,但是128—255段各自相异
字符各异的字符串理论长度为: 256
中、日、韩等国的象形文字,双字节字符集:其中汉字为GB系列(典型如GBK)
在GBK编码中,不论中英文都是双字节的
UTF-8为国际通用编码:
“外国人访问GBK网页要下载中文语言包支持,访问UTF-8编码的网页不出现此类问题”20200104异或运算
常用结论
1.任何数与0异或 = 自身:00=0,01=1
2.任何数与1异或 = 自身取反:10=1,11=0
3.任何数自我异或 = 重置为0:11=0,00=0
1用于补充二进制位数,不产生异或运算影响;
2用于按位取反,即位翻转,经常需要与1相结合使用;
3用于置0/初始化/判等,eg: return ((a ^ b) == 0)
汇编上置0: xor a,a
异或运算不仅可以判等,也可应用于比较大小
3次异或运算实现两数交换:
a = a^b;//第1个结果为较大数与较小数之差值
b = b^a;//第2、3个数开始交换原始数值
a = a^b;
a^b = b^a,数学上类似 (a-b)^2 = (b-a)^2,均匀分布方差=1/12平方值区分逻辑与按位
(以C/C++为例)
逻辑运算:逻辑运算即是布尔运算,结果非真(true)即假(false)
一共3个: 与&& 或|| 非!
位运算:用于快速完成运算操作(基于底层二进制)
一共4个: 按位与& 按位或| 按位非~ 按位异或^判断奇偶
按位与运算的应用:任何数可跟1按位与实现奇偶数判断,即
A1=1则为奇数,A1=0则为偶数
因为“0000……0001”使得原数值二进制表示后仅最末尾有实际意义,且“同真才真”区别与联系
(对立统一)
逻辑运算与、逻辑或有短路机制,按位与、按位或不会短路
按位运算符可以用于逻辑运算,但是执行效率更低
逻辑运算用于逻辑判断,按位运算用于数值运算后记补充
Markdown插入数学公式办法
后记交流
QQ:2636105163 可发邮件,也可加好友 群聊:956349248
手工码字,如有错误欢迎指正!
2020/01/04 05:53
二进制数据在python中以字节(bytes)类型和字节数组类型(bytearray)保存着,前者数据固定,后者不固定,可继续添加。其每个元素为一个字节的数值,一字节由8位二进制数字组成,换算为10进制,位于0-255之间。
ASCII码:一个英文字母占一个字节的空间,一个中文汉字占两个字节的空间。
UTF-8编码:一个英文字符等于一个字节,一个中文(含繁体)占三个字节
Unicode编码:一个英文字符等于一个字节,一个中文(含繁体)占三个字节
二进制数据
with open('somefile.bin', 'wb') as f:
f.write(b'Hello World')当写入二进制数据时,数据必须是以对象的形式提供,而且该对象可以将数据以字节形式暴露出来(字节串、bytearray对象)
with open('somefile.bin', 'rb') as f:
data = f.read()
print(data)当读取二进制数据时,所有的数据将以字节串的形式返回
字节串和文本字符串之间的微妙语义差异。特别要注意的是在做索引和迭代操作时,字节串会返回代表该字节的整数值而不是字符串
t = 'Hello World'
b = b'Hello World'
print(t[0], b[0]) # H 72
如果需要在二进制文件中读取或写入文本内容,要做好相应的编码或解码操作
with open('somefile1.bin', 'wb') as f:
text = 'I love study'
f.write(text.encode('utf-8'))encode(编码):按照某种规则将“文本”转换为“字节流”,该方法返回编码后的字符串,它是一个 bytes 对象
with open('somefile1.bin', 'rb') as f:
data1 = f.read(16)
text1 = data1.decode('utf-8')
print(text1)decode(解码):将“字节流”按照某种规则转换成“文本”。
关于encode和decode的一些补充:
python3中对文本和二进制做了比较清晰的区分。python3默认编码为unicode,由str类型进行表示。二进制数据使用byte类型表示
字符串通过编码转换为字节码,字节码通过解码转换为字符串
str--->(encode)--->bytes,bytes--->(decode)--->strimport io
import sys
sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding='utf8')
name='小明'
name1=name.encode('utf-8')
name2=name1.decode('utf-8') # 假如指定gbk会乱码
print(type(name2))
print(name2)name3 = name.encode('gbk')
name4 = name3.decode('gbk') # 假如指定utf-8会报错
print(name4)name1是以utf-8编码的字节流,解码也要指定为utf-8,假如指定gbk,输出就会乱码;以什么字符集编码也要以什么字符集解码
python默认的是unicode编码的,name是Unicode编码的,所以不难看出,其实utf-8和gbk之间都是通过unicode来做一个中间转换的操作
utf-8是unicode扩展集
字符与字节(byte):
1个字符是8个字节byte
字节与二进制(bit):
1个字节有8位
英文:ASCII码,占1个字节,1个字节有两种选择(0或1),因此有 2^8=256种类型。
中文:gbk。
unicode(uft-8,uft-16)编码全球统一编码,1个字符占2个字节,用十六进制编码形式表示。
char c1 = '\u0061',\u :表示后面借的是十六进制unicode 编码。
0061 十六进制转换成二进制:0000 0000 0110 0001
二进制、十进制、十六进制转化:
二进制--十进制:
1101---1*2^0+0*2^1+1*2^2+1*2^3 = 1+4+8 = 13
十进制--二进制
13---(8+4+1)1101
二进制--十六进制(0-9,10-15(a-f)
1101---先转成十进制,再转十六进制
ASCII码:
一个英文字母(不分大写和小写)占一个字节的空间。一个中文汉字占两个字节的空间。一个二进制数字序列,在计算机中作为一个数字单元,一般为8位二进制数,换算为十进制。
最小值0,最大值255。如一个ASCII码就是一个字节。
UTF-8编码:
一个英文字符等于一个字节,一个中文(含繁体)等于三个字节。
Unicode编码:
一个英文等于两个字节,一个中文(含繁体)等于两个字节。
符号:
英文标点占一个字节,中文标点占两个字节。举例:英文句号“.”占1个字节的大小,中文句号“。”占2个字节的大小。
转载于:https://www.cnblogs.com/lxjshuju/p/7115485.html