Hot-keys on this page
r m x p toggle line displays
j k next/prev highlighted chunk
0 (zero) top of page
1 (one) first highlighted chunk
1# func reverse(value: u8) -> u8:
2# """Reverse the bit order.
3#
4# """
5#
6# value = ((value & 0xaa) >> 1) | ((value & 0x55) << 1)
7# value = ((value & 0xcc) >> 2) | ((value & 0x33) << 2)
8#
9# return ((value & 0xf0) >> 4) | ((value & 0x0f) << 4)
11func reverse(value: u32) -> u32:
12 """Reverse the bit order.
14 """
16 value = ((value & 0xaaaaaaaa) >> 1) | ((value & 0x55555555) << 1)
17 value = ((value & 0xcccccccc) >> 2) | ((value & 0x33333333) << 2)
18 value = ((value & 0xf0f0f0f0) >> 4) | ((value & 0x0f0f0f0f) << 4)
19 value = ((value & 0xff00ff00) >> 8) | ((value & 0x00ff00ff) << 8)
21 return (value >> 16) | (value << 16)
23func leading_ones(value: u32) -> u32:
24 """Count number of leading bits that are one.
26 """
28 for i in range(32):
29 if (value & (0x80000000 >> u32(i))) == 0:
30 return u32(i)
32 return 32
34func leading_zeros(value: u32) -> u32:
35 """Count number of leading bits that are zero.
37 """
39 return leading_ones(~value)
41func count_ones(value: u32) -> u32:
42 """Count number of bits that are one.
44 """
46 value = value - ((value >> 1) & 0x55555555)
47 value = (value & 0x33333333) + ((value >> 2) & 0x33333333)
49 return (((value + (value >> 4)) & 0x0f0f0f0f) * 0x01010101) >> 24
51func count_zeros(value: u32) -> u32:
52 """Count number of bits that are zero.
54 """
56 return count_ones(~value)
58func rotate_left(value: u32, count: u32) -> u32:
59 """Rotate bits left count times.
61 """
63 count %= 32
65 return (value << count) | (value >> (32 - count))
67func rotate_right(value: u32, count: u32) -> u32:
68 """Rotate bits right count times.
70 """
72 count %= 32
74 return (value >> count) | (value << (32 - count))
76# @test
77# func test_reverse_u8():
78# value: u8 = 0x12
79# assert reverse(value) == 0x48
81test reverse_u32():
82 value: u32 = 0x12345678
83 assert reverse(value) == 0x1e6a2c48
85test leading_ones():
86 value: u32 = 0x00000000
87 assert leading_ones(value) == 0
89 value = 0x80000000
90 assert leading_ones(value) == 1
92 value = 0xffffffff
93 assert leading_ones(value) == 32
95 value = 0xffffffef
96 assert leading_ones(value) == 27
98test leading_zeros():
99 value: u32 = 0xffffffff
100 assert leading_zeros(value) == 0
102 value = 0x7fffffff
103 assert leading_zeros(value) == 1
105 value = 0x00000000
106 assert leading_zeros(value) == 32
108 value = 0x00000010
109 assert leading_zeros(value) == 27
111test count_ones():
112 value: u32 = 0x00000000
113 assert count_ones(value) == 0
115 value = 0x10003000
116 assert count_ones(value) == 3
118 value = 0xffffffff
119 assert count_ones(value) == 32
121test count_zeros():
122 value: u32 = 0xffffffff
123 assert count_zeros(value) == 0
125 value = 0xefffcfff
126 assert count_zeros(value) == 3
128 value = 0x00000000
129 assert count_zeros(value) == 32
131test rotate_left():
132 value: u32 = 0x12345678
133 assert rotate_left(value, 8) == 0x34567812
134 assert rotate_left(value, 8 + 32) == 0x34567812
136 value = 0x00000001
137 assert rotate_left(value, 1) == 0x00000002
139test rotate_right():
140 value: u32 = 0x12345678
141 assert rotate_right(value, 8) == 0x78123456
142 assert rotate_right(value, 8 + 32) == 0x78123456
144 value = 0x00000001
145 assert rotate_right(value, 1) == 0x80000000