73 lines
1.9 KiB
Python
73 lines
1.9 KiB
Python
import unittest
|
|
from random import randint
|
|
|
|
|
|
def pop_count(value: int) -> int:
|
|
value -= ((value >> 1) & 0x55555555)
|
|
value = (((value >> 2) & 0x33333333) + (value & 0x33333333))
|
|
value = (((value >> 4) + value) & 0x0f0f0f0f)
|
|
value += (value >> 8)
|
|
value += (value >> 16)
|
|
return value & 0x0000003f
|
|
|
|
|
|
def bit_reverse(value: int) -> int:
|
|
value = (((value & 0xaaaaaaaa) >> 1) | ((value & 0x55555555) << 1))
|
|
value = (((value & 0xcccccccc) >> 2) | ((value & 0x33333333) << 2))
|
|
value = (((value & 0xf0f0f0f0) >> 4) | ((value & 0x0f0f0f0f) << 4))
|
|
value = (((value & 0xff00ff00) >> 8) | ((value & 0x00ff00ff) << 8))
|
|
return (value >> 16) | (value << 16)
|
|
|
|
|
|
def umc_pass_check(v1: int, v2: int) -> bool:
|
|
return pop_count(v1) + pop_count(v2) == 4
|
|
|
|
|
|
class PopCountTest(unittest.TestCase):
|
|
def test_zero(self):
|
|
self.assertEqual(0, pop_count(0))
|
|
|
|
def test_one(self):
|
|
self.assertEqual(1, pop_count(1))
|
|
|
|
def test_two(self):
|
|
for _ in range(4):
|
|
a = randint(0, 8)
|
|
b = randint(0, 8)
|
|
|
|
while a == b:
|
|
b = randint(0, 8)
|
|
|
|
a = 1 << a
|
|
b = 1 << b
|
|
v = a | b
|
|
self.assertEqual(2, pop_count(v))
|
|
|
|
|
|
class BitReverseTest(unittest.TestCase):
|
|
def test_zero(self):
|
|
self.assertEqual(0, bit_reverse(0))
|
|
|
|
def test_one(self):
|
|
self.assertEqual(0x8000_0000, bit_reverse(1))
|
|
|
|
def test_random_one(self):
|
|
for _ in range(4):
|
|
a = randint(0, 15)
|
|
b = 31 - a
|
|
|
|
va = 1 << a
|
|
vb = 1 << b
|
|
|
|
self.assertEqual(vb, bit_reverse(va), f"a = {a}, b = {b}")
|
|
|
|
|
|
class UmcPassCheckTest(unittest.TestCase):
|
|
def test_validate(self):
|
|
self.assertFalse(umc_pass_check(0b0101_0001_0100_0000_0000_0000_0000_0000,
|
|
0b0101_0000_0000_1100_0000_0000_0000_0000))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|