Skip to content

Commit d7d5cf0

Browse files
committed
More solutions for chapter 5
1 parent b3ed023 commit d7d5cf0

File tree

4 files changed

+98
-7
lines changed

4 files changed

+98
-7
lines changed

chapter_5/p5_1.py

+9-7
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,15 @@
11
from utils.binutils import blen
22

3-
def binary_insert(n:int, m:int, i:int, j:int) -> int:
3+
4+
def binary_insert(n: int, m: int, i: int, j: int) -> int:
45
len_n = blen(n)
56
len_m = blen(m)
67

7-
mask = 0b1 << (len_n - j -1)
8-
mask -=1
8+
mask = 0b1 << (len_n - j - 1)
9+
mask -= 1
910
# print(f"Mask is\t{mask:b}")
1011

11-
mask <<=j +1
12+
mask <<= j + 1
1213
# print(f"Mask is\t{mask:b}")
1314

1415
mask += (0b1 << i+1) - 1
@@ -17,15 +18,16 @@ def binary_insert(n:int, m:int, i:int, j:int) -> int:
1718
n &= mask
1819
print(f"N is\t{n:b}")
1920

20-
j_mask = m<<i
21+
j_mask = m << i
2122
# print(f"Jmask is\t{j_mask:b}")
2223
n |= j_mask
2324
return n
2425

26+
2527
if __name__ == "__main__":
2628
n = 0b11110000001
2729
m = 0b1111
28-
i=2
29-
j=6
30+
i = 2
31+
j = 6
3032

3133
print(f"Result of insertion is: {bin(binary_insert(n,m,i,j))}")

chapter_5/p5_6.py

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
def flips_to_convert(a: int, b: int) -> int:
2+
flip_c = 0
3+
while a and b:
4+
flip_c += (a & 0b1) ^ (b & 0b1)
5+
a >>= 1
6+
b >>= 1
7+
8+
while a:
9+
flip_c += a & 0b1
10+
a >>= 1
11+
while b:
12+
flip_c += b & 0b1
13+
b >>= 1
14+
15+
return flip_c
16+
17+
18+
if __name__ == "__main__":
19+
exs = [(0b1000010101, 0b1111), (0b11101, 0b01111),
20+
(0b1, 0b101), (0b101, 0b101)]
21+
for a, b in exs:
22+
print(f"Converting {a:b} into {b:b} flips {flips_to_convert(a,b)}")

chapter_5/p5_7.py

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
def pairwise_swap(a: int) -> int:
2+
select_mask = 0xAAAAAAAA # 16 A's
3+
odd_bits = a & select_mask
4+
even_bits = (a << 1) & select_mask
5+
return (odd_bits >> 1) | (even_bits)
6+
7+
8+
if __name__ == "__main__":
9+
exs = [0b1010, 0b1111, 0b100, 0b110, 0b100101]
10+
for x in exs:
11+
print(f"Swapping {x:10b} --> {pairwise_swap(x):10b}")

chapter_5/p5_8.py

+56
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
from typing import List
2+
3+
4+
def draw_line(screen: List[int],
5+
width_bits: int,
6+
x1: int,
7+
x2: int,
8+
y: int) -> None:
9+
# print(f"Putting line\t{x1} to {x2} on line {y}")
10+
w = width_bits // 8
11+
h = len(screen)//w
12+
13+
start_index = w*y + x1//8
14+
end_index = w*y + x2//8
15+
16+
# print(f"Indexes are\t{start_index} to {end_index}")
17+
18+
start_mask = (0b1 << (8 - (x1 % 8))) - 1
19+
# print(f"Start mask is\t{start_mask:08b}")
20+
21+
if start_index != end_index:
22+
screen[start_index] |= start_mask
23+
24+
for i in range(start_index+1, end_index):
25+
screen[i] |= 0xFF
26+
27+
end_mask = (0xFF << (8 - (x2 % 8))) % 256
28+
# print(f"End mask is\t{end_mask:08b}")
29+
30+
screen[end_index] |= end_mask
31+
else:
32+
start_mask &= (0xFF) << (8 - x2 % 8)
33+
# print(f"Same mask is {start_mask:08b}")
34+
screen[start_index] |= start_mask
35+
36+
37+
def print_screen(screen: List[int], width_bits: int):
38+
width = width_bits//8
39+
for i in range(len(screen)//width):
40+
for j in range(width):
41+
# print(f"{i} -- {j}")
42+
print(f"{screen[i*width+j]:08b}", end=" ")
43+
print()
44+
45+
46+
if __name__ == "__main__":
47+
width_bits = 5 * 8
48+
h = 5
49+
screen = [0 for i in range(width_bits//8) for j in range(h)]
50+
# print_screen(screen, width_bits)
51+
for line_index in range(h):
52+
start_i = line_index + 1
53+
end_i = start_i*5
54+
draw_line(screen, width_bits, start_i, end_i, line_index)
55+
56+
print_screen(screen, width_bits)

0 commit comments

Comments
 (0)