# Possible improvement to slice opperations.

Bengt Richter bokr at oz.net
Tue Sep 6 02:58:58 CEST 2005

```On 05 Sep 2005 12:58:00 -0700, Paul Rubin <http://phr.cx@NOSPAM.invalid> wrote:

>Steve Holden <steve at holdenweb.com> writes:
>> Given that Python has a 1's-complement operator already I don;t see
>> why you can't just leave Python alone and use it,
>
>What's the meaning of the 1's complement operator (for example, what
>is ~1), when ints and longs are the same?

assert ~x == -1-x  # or -1^x

The only problem is seeing the result printed, since people insist
that hex(a) will be '-'[:a<0]+hex(abs(a))

which brings up base-complement representation for signed numbers,
where the first digit is always 0 or base-1 to indicate positive and negative:
(BTW, I found a bug when I dug this up from my disk, so a previous post with this

>>> def basecompl(x, B=10, digits='0123456789abcdefghijklmnopqrstuvwxyz'):
...     if not (2 <= B <= len(digits)): raise ValueError('bad base = %r'%B)
...     if not x: return digits[0]
...     s = []
...     while x and x != -1:
...         x, r = divmod(x, B)
...         s.append(digits[r])
...     if not s or s[-1] != (digits[0], digits[B-1])[x<0]:
...         s.append(digits[x<0 and B-1 or 0])
...     return ''.join(s[::-1])
...
>>> def bcdecode(s, B=10, digits='0123456789abcdefghijklmnopqrstuvwxyz'):
...     if s == digits[0]: return 0
...     acc = s[0].lower() == digits[B-1] and -B**len(s) or 0
...     for i, c in enumerate(s[::-1]):
...         acc += digits.index(c)*B**i
...     return acc
...
>>> bc = basecompl # easier to type ;-)

>>> bc(~3L, 2)
'100'
>>> bc(-1-3L, 2)
'100'
>>> bc(-1^3L, 2)
'100'
>>> bc(~3L, 8)
'74'
>>> bc(-1-3L, 8)
'74'
>>> bc(-1^3L, 8)
'74'
>>> bc(~3L)
'96'
>>> bc(-1-3L)
'96'
>>> bc(-1^3L)
'96'
>>> bc(bcdecode(bc(~3L)))
'96'
>>> bc(bcdecode(bc(~3L, 2),2),2)
'100'
>>> bc(~3L, 16)
'fc'
>>> bc(-1-3L, 16)
'fc'
>>> bc(-1^3L, 16)
'fc'
>>> bc(3L)
'03'

Regards,
Bengt Richter

```