Different calculation result [duplicate] - javascript

This question already has answers here:
Bitshift in javascript
(4 answers)
Closed 1 year ago.
Explain to me why the result of the following calculation is different:
Python:
tmp = 4235635936 << 0 #4235635936
JS
let tmp = 4235635936 << 0 // -59331360
Question - how do I get the same result in python as in js ?

The binary representation for both numbers is the same. One is signed, the other is unsigned.
>>> struct.pack("<i", -59331360)
b'\xe0\xacv\xfc'
>>> struct.pack("<I", 4235635936)
b'\xe0\xacv\xfc'
>>>

in JS, the bitwise operators and shift operators operate on 32-bit ints, and your example overflows the 32-bit capacity.
In Python there's no capacity limit for integers, so you get the actual value.

Related

How do I convert an integer in JavaScript to a 32bits? [duplicate]

This question already has answers here:
How do you convert numbers between different bases in JavaScript?
(21 answers)
Closed 5 months ago.
I have some numbers (base 10) that I want to convert to a 32 bits(base 2), I have tried a lot of things, I found out the >>> operator, but apparently it only converts negative numbers to a base 10 the equivalent of the 32 bits, instead of base 2
const number = 3
const bitNumber = 1 >>> 0
console.log(bitNumber) /// 1
The numbers are always stored as bits internally. It’s console.log that converts them to a string, and the string conversion uses decimal by default.
You can pass a base to Number.prototype.toString:
console.log(bitNumber.toString(2));
and display as many bit positions as you want:
console.log(bitNumber.toString(2).padStart(32, '0'));

Bitwise operations on large numbers [duplicate]

This question already has an answer here:
Bitwise OR operation with 0b transform a given number in negative
(1 answer)
Closed 7 months ago.
This works as expected:
> 0b1111
15
> 0b1111 & 0b1111
15
But this doesn't:
> 0b11111111111111111111111111111111
4294967295
> 0b11111111111111111111111111111111 & 0b11111111111111111111111111111111
-1
What's going on here? And how can I safely perform bitwise operations on large (up to 2^32) numbers in Javascript?
Update: This is below Number.MAX_SAFE_INTEGER so I don't believe there should be a loss of precision.
What's going on here?
JavaScript's bitwise operators will interpret the result as a signed 32-bit number (one exception is the >>> operator), but apart from that, the result is correct.
And how can I safely perform bitwise operations on large (up to 2^32) numbers in Javascript?
Apply >>> 0 to the result so the result is interpreted as an unsigned 32 bit number:
let res = (0b11111111111111111111111111111111
& 0b11111111111111111111111111111111) >>> 0;
console.log(res);

What does `>>>` mean in JavaScript? [duplicate]

This question already has answers here:
What is the JavaScript >>> operator and how do you use it?
(7 answers)
Closed 5 years ago.
What is the meaning of the expression >>> in JavaScript? It is like type conversion, or what, and when it recommended to use?
I ran into that symbol (>>>) when I read this article and am a little confused.
Sorry, if my question is stupid, but I can not find any answers by Google search or other ways.
>>> is a bitwise operator.
>>> (Zero-fill right shift) This operator shifts the first operand the specified number of bits to the right. Excess bits shifted off to the
right are discarded. Zero bits are shifted in from the left. The sign
bit becomes 0, so the result is always non-negative.
For non-negative numbers, zero-fill right shift and sign-propagating
right shift yield the same result. For example, 9 >>> 2 yields 2, the
same as 9 >> 2
From: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators

Converting Decimal Number to Binary [duplicate]

This question already has answers here:
What is the JavaScript >>> operator and how do you use it?
(7 answers)
How do I convert an integer to binary in JavaScript?
(17 answers)
Closed 5 years ago.
I found this code on W3schools for converting decimal into binary.
function dec2bin(dec){
return (dec >>> 0).toString(2);
}
I don't understand what is the purpose for making zero fill right shift in this case? What is the use of setting the shift to 0 (i.e. dec >>> 0) since as I know it doesn't push any binary digit to the right at all?
I am a JS beginner. Thanks!

How does the expression "float | 0" produces an integer? [duplicate]

This question already has answers here:
Using bitwise OR 0 to floor a number
(7 answers)
Closed 8 years ago.
Please describe how does 5.55 | 0 produces 5 in JavaScript. I want to know what is happening in this bitwise operating. Thanks!
The bitwise operators in Javascript automatically coerce their arguments to 32-bit integer values by dropping the fraction and any high-order bits beyond 32. So
5.55 | 0
is treated like:
5 | 0
The operands of bitwise operations are always converted to signed 32-bit integers in big-endian order and in two's complement format.
That would be
00000000000000000000000000000101
or 00000000000000000000000000000000
------------------------------------
00000000000000000000000000000101

Categories