What is a more efficient way to perform bitwise operations in Python?

  • Context: Python 
  • Thread starter Thread starter Adyssa
  • Start date Start date
  • Tags Tags
    Operations Python
Click For Summary
SUMMARY

The discussion focuses on efficient methods for performing bitwise operations in Python without using built-in operators. Two implementations are provided: a string-based approach and a more efficient integer-based method using the divmod operator. The divmod_and function effectively calculates the bitwise AND by iterating through the bits of the input integers, utilizing both division and modulus operations to derive the result. This method is preferred for its simplicity and efficiency in handling bitwise operations.

PREREQUISITES
  • Understanding of bitwise operations (AND, OR, XOR, NOT)
  • Familiarity with Python programming language
  • Knowledge of integer manipulation and binary representation
  • Experience with Python's divmod function
NEXT STEPS
  • Explore Python's built-in bitwise operators for comparison
  • Learn about Python's integer types and their binary representations
  • Investigate performance implications of different bitwise operation implementations
  • Study advanced bit manipulation techniques in Python
USEFUL FOR

Python developers, computer science students, and anyone interested in optimizing bitwise operations in programming.

Adyssa
Messages
202
Reaction score
3
I'm playing around in Python at the moment, and I came across an exercise to perform bitwise operations manually (without the built in & | ^ ~ operators).

I understand the operations on paper, and I have a function here that performs them (& in this case, the others are similar):

Code:
def bitwise_and(num1, num2):

	result = "" # the result of the bitwise and operation

	while num1 > 0 or num2 > 0:
		# num % 2  != 0 implies a 1-bit in the lowest position
		if num1 % 2 != 0 and num2 % 2 != 0: 
			result = "1" + result # both bits are 1, so 1 & 1 == 1, append 1 to result
		else:
			result = "0" + result# at least one 0 bit, 1 & 0 == 0, 0 & 0 == 0, append 0

		num1 = num1 >> 1 # drop the last bit
		num2 = num2 >> 1 # drop the last bit

	return int(result,2) # return an int representation of the result binary string

I'd like some help modifying this implementation to use an integer type for the result instead of a string type which I then have to convert. I was trying to set the current result bit and then left shift (<<) but it didn't work when I only had 0 bits to work with because 0b0 == 0b00 == 0b0000000 so there's no significant 1 bit to shift. Is there a neater way do this?
 
Last edited:
Technology news on Phys.org


I've not programmed in Python, however, ... Have you considered using the divmod operator, with the 'div' bit providing the shifted number and then multiplying the 'mod' bits together (then iterating until the 'div' bit of either number is 0). It seems to work in Mathcad ...

attachment.php?attachmentid=54739&stc=1&d=1358249555.jpg
 

Attachments

  • phys - 13 01 15 boolean 01.jpg
    phys - 13 01 15 boolean 01.jpg
    33.2 KB · Views: 932


Thanks, that's nice and simple :) I can stare at problems forever and just not grok things properly sometimes! Here's some Python code:

Code:
#divmod version

def divmod_and(x, y):
    z = 0
    p = 1
    while x or y:
        x, xd = divmod(x, 2)
        y, yd = divmod(y, 2)
        z = p * xd * yd + z
        p <<= 1

    return z

# manual mod and divide for clarity

def bitwise_and(x, y):
    result = 0
    power = 1
    while x or y:
        bit = x % 2 * y % 2 # both bits on == 1
        result = bit * power + result
        x /= 2
        y /= 2
        power <<= 1

    return result
 

Similar threads

  • · Replies 8 ·
Replies
8
Views
8K
  • · Replies 15 ·
Replies
15
Views
2K
  • · Replies 5 ·
Replies
5
Views
3K
Replies
55
Views
7K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 3 ·
Replies
3
Views
2K
  • · Replies 2 ·
Replies
2
Views
2K
  • · Replies 2 ·
Replies
2
Views
3K
  • · Replies 5 ·
Replies
5
Views
5K
  • · Replies 10 ·
Replies
10
Views
2K