基本功

DeepOps的程序员数学小笔记-二进制

转发请标注原文链接:http://www.mimiq.com.cn/?p=418

1 二进制

电路只有开、关两种状态。使用 0 、1 表示。十进制中 10 为基数,二进制中 2 为基数

1.1 python 十进制 转换为 二进制、八进制、十六进制

# 十进制 --> 二进制
n2 = 17
r2 = bin(n2)   

# 十进制 --> 八进制
n8 = 17
r8 = oct(n8)   

# 十进制 --> 十六进制
n16 = 17
r16 = hex(n16) 

print(n2,' --> ',r2)  
print(n8,' --> ',r8)
print(n16,' --> ',r16) 
#result:
17  -->  0b10001
17  -->  0o21
17  -->  0x11

1.2 python 二进制、八进制、十六进制 转换为 十进制

# 二进制 --> 十进制
s2 = '0b10001'
r2 = int(s2,base=2) 

# 八进制 --> 十进制
s8 = '0o21'
r8 = int(s8,base=8) 

# 十六进制 --> 十进制
s16 = '0x11'
r16 = int(s16,base=16) 

print(s2,' --> ',r2)  
print(s8,' --> ',r8)
print(s16,' --> ',r16) 
#result:
0b10001  -->  17
0o21  -->  17
0x11  -->  17

1.3 其他一些用法

s = '11'
r1 = int(s,base=16) # 16进制 可以不加0x
r2 = int(s,base=9)  # 9进制 转换为 10进制

print(s,' --> ',r1) 
print(s,' --> ',r2)
#result:
11  -->  17
11  -->  10

2 二进制的位操作

2.1 向左移位

# 正数
n=26
print(n)
print(bin(n))
n2=n<<2       # 左移2位
print(n2)
print(bin(n2))

n3=n<<60
print(n3)
print(bin(n3))
# 负数
n=-26
print(n)
print(bin(n))
n2=n<<2
print(n2)
print(bin(n2))

n3=n<<60
print(n3)
print(bin(n3))
#result:
26
0b11010
104
0b1101000
29975959119778021376
0b11010000000000000000000000000000000000000000000000000000000000000
-26
-0b11010
-104
-0b1101000
-29975959119778021376
-0b11010000000000000000000000000000000000000000000000000000000000000

2.2 向右移位

右移操作区分:算术右移 逻辑右移逻辑右移使用>>>(python中无逻辑右移操作符,没有java重编码测试),右移后左边补0;算术右移使用>>,右移后,符号位右侧补1。负数采用补码方式记录。

# 正数
n=53
print(n)
print(bin(n))
n2=n>>1
print(n2)
print(bin(n2))
n3=n>>7
print(n3)
print(bin(n3))
# 负数
n=-53
print(n)
print(bin(n))
n2=n>>1
print(n2)
print(bin(n2))
n3=n>>7
print(n3)
print(bin(n3))
#result
53
0b110101
26
0b11010
0
0b0

-53
-0b110101
-27
-0b11011
-1
-0b1

2.3 位的“或”、“与”、“异或”、非

a = 60
b = 13
print('a:',bin(a))
print('b:',bin(b))


print('a&b:',bin(a&b))
print('a|b:',bin(a|b))
print('a^b:',bin(a^b))
print('~a:',bin(~a))

a1=-60
print('a1:',bin(a1))
print('~a1:',bin(~a1))
result:
a: 0b111100
b: 0b1101

a&b: 0b1100
a|b: 0b111101
a^b: 0b110001
~a: -0b111101

a1: -0b111100
~a1: 0b111011

3 原码、反码 和 补码

参考:https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html

原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:[1111 1111 , 0111 1111],即[-127 , 127]

反码
反码的表示方法是:
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反

补码
补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补

反码解决 1-1=0 的问题:

1 – 1 = 1 + (-1) = [0000 0001] + [1000 0001]= [0000 0001] + [1111 1110] = [1111 1111] = [1000 0000] = -0

码解决了反码相加 等于 -0 的问题:

1-1 = 1 + (-1) = [0000 0001] + [1000 0001] = [0000 0001] + [1111 1111] = [0000 0000]=[0000 0000]


参考资料:

  • 极客时间-程序员的数学基础课
  • 结城浩-程序员的数学

下面是极客时间的该课程快捷入口:

二、DeepOps的设计模式小笔记-DAY1-Iterator迭代器

今天要来学习迭代器模式, 猛地一看真的没什么内容. 但是翻开书(设计模式)之后, 发现事情没有那么简单!

1 主要意图

迭代器模式主要:提供一种方法顺序访问一个聚合对象中的各个元素,而又不需要暴露该对象的内部表示。

2 组成

2.1 接口

  • Iterator (迭代器) : 定义访问和遍历元素的接口。
  • Aggregate (聚合) : 定义创建相应迭代器对象的接口。

2.2 实现

  • ConcreteIterator(具体迭代器):实现迭代器接口 ;对聚合遍历时跟踪当前位置。例如下图中的 BookShelfIterator 。
  • ConcreteAggregate(具体聚合):实现创建相应迭代器的接口 ;该操作返回ConcreteIterator的一个适当实例 。例如下图中的 BookShelf 。

3 迭代器模式的三个重要作用

  • 支持不同方式遍历一个聚合
  • 简化了聚合的接口
  • 在同一个聚合上可以有多个遍历

4 实现

4.1 谁来控制该迭代

是否由使用者控制迭代 ? ” ,作为 ” 外部迭代器 ” 和 ” 内部迭代器 “的区分依据。外部迭代器:必须由使用者主动推进便利的不发,现实的向迭代器请求下一元素。而内部迭代器:则只需要想起提交一个待执行操作,迭代器将会对聚合内的每一个元素应用该操作。

4.2 谁定义遍历算法

迭代器 聚合 本身的都可以定义遍历算法。

聚合 中 定义遍历算法 :这种迭代器被称作 “游标(cursor)” ,以游标为参数调用该聚合的next操作.

迭代器 中定义遍历算法 : 容易在相同的聚合上使用不同的迭代算法; 也容易在不同的聚合上重用相同的算法. 但是遍历算法可能需要访问聚合的私有变量, 这样会破坏聚合的封装性.

4.3如何保证迭代器的健壮性

健壮的迭代器, 保证插入和删除操作不会干扰遍历\不需要copy该聚合。

总结

还是 “设计模式”中描述的内容比较详尽, “图解设计模式”确实比较浅显易懂, 想多了解一些就得换一本书了, 但是不得不说, 图多的就是比字多的容易看进入.

设计模式小笔记系列

有兴趣可以看看这个教程

一、DeepOps的设计模式小笔记-总述

程序员的基本功之一“ 设计模式 ”,感觉曾经学了很多遍还是一知半解,每次都是重新学习的感觉,为了避免这种低效的学习,决定一次性的把设计模式学习透彻。

1 收集资料

纸质书籍:图解设计模式、GOF的设计模式、Head First设计模式

–为什么叫Gof呢,我搜了一下百度是这么说的“ 《Design Patterns: Elements of Reusable Object-Oriented Software》(即后述《设计模式》一书),由 Erich Gamma、Richard Helm、Ralph Johnson 和 John Vlissides 合著(Addison-Wesley,1995)。这几位作者常被称为”四人组(Gang of Four)” ”

电子资料:极客时间的王争老师的专栏《设计模式之美》目前正在更新中未完结(页面最下方有专栏的链接,有兴趣可以看一下)。

根据目前的情况我市选择图解设计模式为主,设计模式和王争老师的课程为辅的进行交叉学习。

2 汇总资料内容

根据目前的书籍资料简单整理了一个脑图,随着我的学习进展会不断的更新这个脑图,随后会提供一个pdf版本的下载。

查看原图可以放大一些,比较清楚。

红色小旗子标注的是王争老师专栏里面介绍到的经常使用的设计模式,红色数字1标注的是Gof书籍中推荐新手刚入门的时候的优先学习建议。

3 我的学习计划

我决定根据图解设计模式书中的目录顺序,优先学习红色小旗子的内容。应该14个红色的小旗子,还有一个只是红色的数字1 没有插旗子,一共15个,15天。

  • DAY1: 1 Iterator
  • DAY2: 2 Adapter
  • DAY3: 3 Template Method
  • DAY4: 4 Factory Method
  • DAY5: 5 Singleton
  • DAY6: 7 Builder
  • DAY7: 8 Abstract factory
  • DAY8: 9 Bridge
  • DAY9: 10 Strategy
  • DAY10: 11 Composite
  • DAY11: 12 Decorator
  • DAY12: 14 Chain of responsibility
  • DAY13: 17 Observer
  • DAY14: 19 state
  • DAY15: 21 Proxy

设计模式小笔记系列

有兴趣可以看看这个教程