Ask Your Question
1

Bitwise NOT Operator for Sage?

asked 10 years ago

david8381 gravatar image

0b1000 & 0b1001 (AND) 0b1000 | 0b1001 (OR) 0b1000 ^^ 0b1001 (XOR)

All of these work as bitwise operators on the command line -- but how do I do bitwise NOT?

Preview: (hide)

2 Answers

Sort by » oldest newest most voted
3

answered 10 years ago

tmonteil gravatar image

updated 10 years ago

The bitwise not in Python is supposed to be ~(see https://wiki.python.org/moin/BitwiseO... about how negative numbers are encoded), but Sage's preparser first transforms 0b1000 as an element of ZZ for which the action of ~ is the multiplicative inverse:

sage: ~0b1000
1/8

This is because, in Sage:

sage: 0b1000.parent()
Integer Ring
sage: preparse("0b1000")
"Integer('1000', 2)"

To get the python behaviour, you can either turn the sage preparser off:

sage: preparser(False)
sage: ~0b1000
-9

or explicitely use python int:

sage: ~int(0b1000)
-9

Another workaround is to notice that not a is the same as a xor 1.

Preview: (hide)
link
1

answered 10 years ago

slelievre gravatar image

As a complement to @tmonteil's answer, you can append 'r' (for 'raw') to some input to prevent it from being preparsed, without globally turning the preparser off.

Using the same example as @tmonteil:

sage: ~0b1000r
-9
Preview: (hide)
link

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools

1 follower

Stats

Asked: 10 years ago

Seen: 2,842 times

Last updated: Aug 20 '14