3 ms·
The python result should be expected. Python's integer type isn't sized, that is python will happily give you factorial(100), despite it being much larger than
by zardeh 10y ago
The python result should be expected. Python's integer type isn't sized, that is python will happily give you factorial(100), despite it being much larger than 64 bits. It can't then give you twos complement, because it can't know the size with which to complement the two.
- yogeswarant 10y agoThanks. Good to know this.
- d0mine 10y agoBitwise opetations assume an infinite number of 1s on the left for negative numbers (2s compliment) e.g., ~-1 == 0 (-1 is an infinite number of 1s that are converted to 0 by ~ (invert) operator ). 3 == 011 2 == 010 1 == 001 0 == 000 -1 == ..111 -2 == ..110 -3 == ..101
- brandonbloom 10y agoThat's a reasonable tradeoff for Python, but it's worth noting that there is a way to deal with this. Quoting from http://reference.wolfram.com/language/tutorial/IntegerAndNumberTheoreticalFunctions.html http://reference.wolfram.com/language/tutorial/IntegerAndNum... Bitwise operations are used in various combinatorial algorithms. They are also commonly used in manipulating bitfields in low‐level computer languages. In such languages, however, integers normally have a limited number of digits, typically a multiple of 8. Bitwise operations in the Wolfram Language in effect allow integers to have an unlimited number of digits. When an integer is negative, it is taken to be represented in two's complement form, with an infinite sequence of ones on the left. This allows BitNot[n] to be equivalent simply to (-1 - n).
- gpvos 10y agoYes, but how would you print that infinite sequence of 1s?
- ema 10y agosame as the infinite number of zeros in front of a positive number.
- AstralStorm 10y agoJust trimming 1s would be ambiguous. Is b11 3 or -2? You would have to add a 0 prefix to all positive numbers or some other to negative.
- brandonbloom 10y agoJust prefix a + or - just like you do for base 10.
- gpvos 10y agoSo then it would not make much of a difference anymore with what Python does. Which was what they wanted to avoid.
- throwawayish 10y agoIndeed. For this use case to_bytes would be correct (writing this in the most verbose way possible :) >>> (-352).to_bytes(length=4, byteorder='big', signed=True).hex() 'fffffea0' >>> (352).to_bytes(length=4, byteorder='big', signed=True).hex() '00000160' Note how well-defined and independent of the actual machine this conversion is. Since you define everything - length, byte order and whether to get two's complement or not - you'll get the same output everywhere.