进制转换

python实现进制转换是十分容易的,可通过hex(),otc(),bin()等函数将十进制转换为十六进制、八进制和二进制等,为了改变垃圾的code能力,这里还是手写了一下

第一道题目为十六进制转八进制,提示说先将十六进制转换为某种进制,在转换为八进制:

傻傻的我竟然认为是先转十进制再转八进制,理论可行,但速度太慢,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# hexoadecimal 十六进制的
# octal 八进制的
# decimal 十进制的
# quotient 商、系数、份额
# remainder 余数

def hexToDec(hex):
# 判断是否为负数
isNegative = 0
if hex[0] == '-':
hex = hex[1:]
isNegative = 1
# 十进制数初始化
dec = 0
hex = list(hex)
l = len(hex)
t = ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F')
for i in range(l):
dec = dec + t.index(hex[i]) * (16 ** (l-1-i))
if isNegative:
return dec*(-1)
else:
return dec


def decToOct(dec):
# 十进制除8取余倒序排列即可
res = []
while 1:
if dec // 8 <= 0:
res.append(str(dec))
break
else:
res.append(dec % 8)
dec = dec // 8
res.reverse()
oct = ''
for x in res:
oct = oct + str(x)
return oct


if __name__ == "__main__":
n = int(input())
while n>=1:
n = n-1
hex = input()
dec = hexToDec(hex)
# print('dec:', dec)
oct = decToOct(dec)
print(oct)

运行超时我竟然以为是python太慢的原因(真的太蠢了),用c++实现了一下(写的时候才发现c++忘得差不多了),代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
#include<iostream>
#include<string>
#include<math.h>
#include<sstream>
using namespace std;


string intToStr(int i){
stringstream ss;
ss<<i;
return ss.str();
}


int hexToDec(string hex){
int isNegative = 0;
if(hex[0]=='-'){
hex = hex.substr(1,hex.length()-1);
isNegative = 1;
}
int l = hex.length();
int dec = 0;
string t = "0123456789ABCDEF";
for(int i = 0 ; i < l ; i++){
dec += t.find(hex[i]) * (pow(16,(l-1-i)));
}
if (isNegative){
return dec*(-1);
}
else{
return dec;
}
}


string decToOtc(int dec){
int isNegative = 0;
if(dec < 0){
dec *=-1;
isNegative = 1;
}
string res = "";
while (1){
if (dec / 8 <= 0){
res.append(intToStr(dec));
break;
}
else{
res.append(intToStr(dec % 8));
dec = dec /8;
}
}
// cout<<"res:"<<res<<"res[0]"<<res[0]<<"\n";
string otc = "" ;
int l = res.length();
if(isNegative){
otc.append("-");
}
for(int i = l-1;i>=0;i--){
string x(1,res[i]); //使用string的构造函数将char类型转换为string类型
otc.append(x); //这里一直报错,看了半天原来str[0]返回的是char类型
}
return otc;
}


int main(){
int n;
cin>>n;
while(n>0){
n--;
string hex;
cin>>hex;
// getline(cin,hex);
int dec = hexToDec(hex);
// cout<<"dec:"<<dec<<"\n";
string otc = decToOtc(dec);
cout<<otc<<"\n";
}
}

c++同样运行超时,因为我看他的测试用例有十万位长,后同学提醒,肯定是先转十六先转二进制,再转八进制(十六进制对应二进制4位,八进制对应十六进制3位),python代码如下(这里省略了负数判定情况,题目给的输入全是正数,不想改了):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#单个十六进制字符转四位二进制
def singleHexToBin(h):
h = str(h)
t = ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F')
res = bin(t.index(h))
res = res[2:]
b = ''
if len(res) < 4:
for i in range(4-len(res)):
b = b + '0'
b = b + res
return b

#十六进制字符串转二进制,
def hexToBin(h):
b = ''
for x in h:
b = b + singleHexToBin(x)
while(True):
if b[0]!='0':
break
else:
b = b[1:]
return b

# 二进制字符串转八进制字符串
def binToOtc(b):
if (len(b) % 3) !=0:
z = 3 - ( len(b) % 3 )
if z == 1:
b = '0'+b
elif z == 2:
b = '00'+b
o = ''
t = ('000','001','010','011','100','101','110','111')
while(len(b)>0):
group = b[-3:]
o =str(t.index(group)) + o
b = b[:-3]
return o


if __name__ == "__main__":
n = int(input())
for i in range(n):
h = input()
b = hexToBin(h)
o = binToOtc(b)
print(o)

结果还是运行超时,还是用了python自带函数通过了,代码如下:
1
2
3
4
5
6
7
8
9
10
11
# 简单又快速,就是用的有点不好意思
# import time
# start = time.time()
n = int(input())
for i in range(n):
h = input()
res = oct(int(h,16))
res = str(res)
print(res[2:])
# end = time.time()
# print('time:',end-start)

第二题为十六进制转十进制,上面实现过了,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
def hexToDec(hex):
# 判断是否为负数
isNegative = 0
if hex[0] == '-':
hex = hex[1:]
isNegative = 1
# 十进制数初始化
dec = 0
hex = list(hex)
l = len(hex)
t = ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F')
for i in range(l):
dec = dec + t.index(hex[i]) * (16 ** (l-1-i))
if isNegative:
return dec*(-1)
else:
return dec


if __name__ == "__main__":
h = input()
print(hexToDec(h))

第三题为十进制转十六进制,原理和十进制转二进制一样(除二取余,倒叙排列),这里就是除16取余,倒序排列,然后把大于等于10的余数映射为A~F即可,代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
def decToHex(d):
t = ('0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F')
h = ''
while True:
if d // 16 <=0:
h = t[d % 16] + h
break
else:
h = t[d % 16] + h
d = d // 16
return h

if __name__ == '__main__':
# while True:
a = int(input())
print(decToHex(a))

linux操作系统笔记

1
waitpid(pid,statu, )   //指定某一个进程进行回收

进程间的通信方式

僵尸进程

  1. 有影响新进程的产生
  2. 保存了很多进程中的信息

weit3()

库函数system()

c语言中实现调用shell
system()
原理:

  1. fork产生一个子进程
  2. exce执行相关shell命令
  3. 子进程用exit推出子进程
  4. 。。。。。。

进程的通信

  • 软中断
  • 管道(使用最简单)
  • 信号量(开销小)
  • 共享映射区(无血缘关系)
  • socket(最稳定)

1.管道通信

  1. 本质是一个伪文件(不占用磁盘空间)
  2. 有读端和写端
  3. 结构为一个环形队列
  4. pipe()为系统调用
    1
    2
    3
    int p[2]
    status = pipe(p)
    //p[0]用于从管道写,p[1]用于从管道读
  • 特点:
    • 管道默认是阻塞的
    • 管道适用于与血缘关系的进程

信号量(pv操作)

消息队列

共享内存(能实现大量数据传输,解决了消息队列的弱点)

  1. 基本流程
    1. 获取物理内存
    2. 映射到虚拟地址空间
    3. 使用后释放
  2. ipcs 命令
    1. ipcs -m 查看系统中存在的共享内存
    2. ipcrm shm 杀掉共享内存

文件映射 mmap(文件映射到虚拟空间中)

  1. 特点
    1. 普通读文件先从硬盘到内核缓存,再到物理内存共进行了两次拷贝
    2. mmap操作直接从硬盘拷贝到物理内存,只进行了一次拷贝
  2. 常见错误
    1. len = 20 ,filelength = 0 :产生BusError总线错误
    2. 文件只有只读权限,映射内存也为只读权限:产生段错误,无写权限
    3. 文件和映射内存都只有只写权限:产生读错误
    4. offset 9
    5. 越界:

信号(常见信号为1到31)

信号的产生

  1. 按键产生:
    • ctrl+c 2号
    • ctrl+z 1号
    • ctrl+\ 3号
  2. kill(pid_t pid , int sig);
  3. sigprocmask 函数 :屏蔽信号,接触屏蔽

信号捕捉特性

  1. 信号执行期间,信号屏蔽字有mask -> s_mask
  2. 某信号执行期间,某信号自动被屏蔽
  3. 阻塞信号不支持排队

SIGCHLD信号

  1. 条件
    • 子进程终止
    • 子进程接收到SIGSTOP信号
    • 子进程接收到continue信号

守护进程

  1. 特点:
    • 独立于控制终端
    • 周期性执行某任务
    • 不受用户登陆注销影响
    • 一般采用以d结尾的名字
  2. 进程组
    *
  3. 会话
    *

vscode使用JupyterNotebook

环境

  • Anaconda
  • VSCode
  • Jupyter

背景

原本准备使用网页版的jupyterNotebook,在配置过程中遇到了不少问题(都是自找的),后来直接重装anaconda,配置config(设置默认路径和启动的浏览器)后就可以用了,但是发现浏览器启动jupyter服务对文件管理和命名不太方便,因此尝试使用vscode的jupyter扩展

正常情况

正常安装anaconda会在base环境中自带JupyterNotebook,在vscode中安装python插件(jupyter已经集成在python插件中),然后ctrl+shift+p选择创建jupyterNotebook就会自动连接base环境下的python.exe,即自动连接kernel,就可以编写notebook啦!

问题

我的vscode选择启动后一直提示:command failed……

解决办法

因为win10环境变量TEMP和TMP 的路径存在中文(我的win10用户名为中文)导致的奇怪问题,将TEMP和TMP的路径改为:”C:/Windows/TEMP”,问题解决!

Tips:以后一定要使用英文命名,防止奇怪问题出现浪费时间