python模拟实现cpp的二进制

from collections import Sequence
import math


class Bitset(Sequence):
        """
        A very simple bitset implementation for Python.

        Author: Geremy Condra
        Licensed under GPLv3
        Released 3 May 2009

        Usage:
        >>> b = Bitset(5)
        >>> b
        Bitset(101)
        >>> b[:]
        [True, False, True]
        >>> b[0] = False
        >>> b
        Bitset(001)
        >>> b << 1
        Bitset(010)
        >>> b >> 1
        Bitset(000)
        >>> b & 1
        Bitset(001)
        >>> b | 2
        Bitset(011)
        >>> b ^ 6
        Bitset(111)
        >>> ~b
        Bitset(110)
        """

        value = 0
        length = 0

        @classmethod
        def from_sequence(cls, seq):
                """
                Iterates over the sequence to produce a new Bitset.
                As in integers, the 0 position represents the LSB.
                """
                n = 0
                for index, value in enumerate(reversed(seq)):
                        n += 2**index * bool(int(value))
                        b = Bitset(n)
                return b

        def __init__(self, value=0, length=0):
                """Creates a Bitset with the given integer value."""
                self.value = value
                try:
                        self.length = length or math.floor(math.log(value, 2)) + 1
                except Exception:
                        self.length = 0

        def __and__(self, other):
                b = Bitset(self.value & int(other))
                b.length = max((self.length, b.length))
                return b

        def __or__(self, other):
                b = Bitset(self.value | int(other))
                b.length = max((self.length, b.length))
                return b

        def __invert__(self):
                b = Bitset(~self.value)
                b.length = max((self.length, b.length))
                return b

        def __xor__(self, value):
                b = Bitset(self.value ^ int(value))
                b.length = max((self.length, b.length))
                return b

        def __lshift__(self, value):
                b = Bitset(self.value << int(value))
                b.length = max((self.length, b.length))
                return b

        def __rshift__(self, value):
                b = Bitset(self.value >> int(value))
                b.length = max((self.length, b.length))
                return b

        def __eq__(self, other):
                try:
                        return self.value == other.value
                except Exception:
                        return self.value == other

        def __int__(self):
                return self.value

        def __str__(self):
                s = ""
                for i in self[:]:
                        s += "1" if i else "0"
                return s

        def __repr__(self):
                return "Bitset(%s)" % str(self)

        def __getitem__(self, s):
                """
                Gets the specified position.
                Like normal integers, 0 represents the MSB.
                """
                try:
                        start, stop, step = s.indices(len(self))
                        results = []
                        for position in range(start, stop, step):
                                pos = len(self) - position - 1
                                results.append(bool(self.value & (1 << pos)))
                        return results
                except BaseException:
                        pos = len(self) - s - 1
                        return bool(self.value & (1 << pos))

        def __setitem__(self, s, value):
                """
                Sets the specified position/s to value.
                Like normal integers, 0 represents the MSB.
                """
                try:
                        start, stop, step = s.indices(len(self))
                        for position in range(start, stop, step):
                                pos = len(self) - position - 1
                                if value:
                                        self.value |= (1 << pos)
                                else:
                                        self.value &= ~(1 << pos)
                                maximum_position = max((start + 1, stop, len(self)))
                                self.length = maximum_position
                except BaseException:
                        pos = len(self) - s - 1
                        if value:
                                self.value |= (1 << pos)
                        else:
                                self.value &= ~(1 << pos)
                        if len(self) < pos:
                                self.length = pos
                return self

        def __iter__(self):
                """Iterates over the values in the bitset."""
                for i in self[:]:
                        yield i

        def __len__(self):
                """Returns the length of the bitset."""
                return self.length

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值