Python Forum
Code using only bit manupulation
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Code using only bit manupulation
#1
HI,

Need advice about my code. I a newbie at this so hope you will be gentle Smile :).

Have I done this correctly?
Reply
#2
# This is a trial code to write the four function
# (addition, subtraction, multiplication & division)
# using bitwise operations only. I am doing this to
# improve my boolean logic and algorithms

num1 = int()  # We define two variables
num2 = int()  # to use in all our functions
data = int()  # this is carry handling
mask = 0xffffffff
sign = bool(False)


# Addition function
def addition(num1, num2):
    while (num2 & mask) != 0:
        data = (num1 & num2)
        num1 = num1 ^ num2
        num2 = data << 1
    return num1 & mask if num2 > 0 else num1


# Subtraction function
def subtraction(num1, num2):
    data = addition(num1, ~num2)
    data = addition(data, 1)
    return data


# Multiplication Function
def multiplication(num1, num2):
    sign = (num1 < 0) ^ (num2 < 0)
    num1 = abs(num1)
    num2 = abs(num2)
    data = int(0)

    while num2 > 0:
        if 1 & num2 == 1:
            data = addition(data, num1)
        num1 <<= 1
        num2 >>= 1
    if sign:
        data = addition(~data,1)
    return data


# Division Function
def division(num1, num2):
    sign = (num1 < 0) ^ (num2 < 0)
    num1 = abs(num1)
    num2 = abs(num2)
    data = int(0)

    for i in range(31,-1,-1):

        if num2 << i <= num1:
            num1 = subtraction(num1, num2 << i)
            data = addition(data, 1 << i)

    if sign:
        data = addition(~data, 1)
    return data


inp1 = int(input('Enter first number: '))
inp2 = int(input('Enter second number: '))

addnum = addition(inp1, inp2)
subnum = subtraction(inp1, inp2)
mulnum = multiplication(inp1, inp2)
divnum = division(inp1, inp2)

print(f'The two number added comes to {addnum}')
print(f'The two number subtracted comes to {subnum}')
print(f'The product of the two numbers is {mulnum}')
print(f'The quotient of dividing the 1st with 2nd number is {divnum}')
Reply
#3
I started adding unittest code to the module to see how it works and unfortunately, addition fails. Here is my code
# This is a trial code to write the four function
# (addition, subtraction, multiplication & division)
# using bitwise operations only. I am doing this to
# improve my boolean logic and algorithms

num1 = int()  # We define two variables
num2 = int()  # to use in all our functions
data = int()  # this is carry handling
mask = 0xffffffff
sign = bool(False)


# Addition function
def addition(num1, num2):
    while (num2 & mask) != 0:
        data = (num1 & num2)
        num1 = num1 ^ num2
        num2 = data << 1
    return num1 & mask if num2 > 0 else num1


# Subtraction function
def subtraction(num1, num2):
    data = addition(num1, ~num2)
    data = addition(data, 1)
    return data


# Multiplication Function
def multiplication(num1, num2):
    sign = (num1 < 0) ^ (num2 < 0)
    num1 = abs(num1)
    num2 = abs(num2)
    data = int(0)

    while num2 > 0:
        if 1 & num2 == 1:
            data = addition(data, num1)
        num1 <<= 1
        num2 >>= 1
    if sign:
        data = addition(~data,1)
    return data


# Division Function
def division(num1, num2):
    sign = (num1 < 0) ^ (num2 < 0)
    num1 = abs(num1)
    num2 = abs(num2)
    data = int(0)

    for i in range(31,-1,-1):

        if num2 << i <= num1:
            num1 = subtraction(num1, num2 << i)
            data = addition(data, 1 << i)

    if sign:
        data = addition(~data, 1)
    return data


import unittest

class TestAddition(unittest.TestCase):
    def test_addition(self):
        for x, y in [
            (5, 7),
            (1, mask+1),
            (13477775778888877, 277777788888888887777)]:
            self.assertEqual(addition(x, y), x+y, f'{x}+{y} failed')

if __name__ ==  '__main__':
    unittest.main()
Output:
F ====================================================================== FAIL: test_addition (__main__.TestAddition.test_addition) ---------------------------------------------------------------------- Traceback (most recent call last): File "/home/eric/Projets/Scratch/2023-01/paillasse/pf/metalione.py", line 72, in test_addition self.assertEqual(addition(x, y), x+y, f'{x}+{y} failed') AssertionError: 1 != 4294967297 : 1+4294967296 failed ---------------------------------------------------------------------- Ran 1 test in 0.000s FAILED (failures=1) λ
Note that Python integers don't work with 32 bits. Conceptually, they have an infinite number of bits.
« We can solve any problem by introducing an extra level of indirection »
Reply
#4
Your code looks solid, especially for a newbie! The issue with your addition function stems from how Python handles integers. Since Python integers aren't limited to 32 bits, you might want to skip the masking part.

Try this tweak in your addition function:

def addition(num1, num2):
    while num2 != 0:
        carry = num1 & num2
        num1 = num1 ^ num2
        num2 = carry << 1
    return num1
This should fix the problem. Good luck!
Reply


Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020