91

I saw this syntax on another StackOverflow post and was curious as to what it does:

var len = this.length >>> 0;

What does >>> imply?

Community
  • 1
  • 1
Jey Balachandran
  • 3,517
  • 5
  • 24
  • 35
  • 1
    That's a right shift operator, but why would you right shift by zero? Is that some kind of cheap way of doing `parseInt`? – Rocket Hazmat Oct 10 '11 at 21:12
  • 5
    `>>>` always sets the sign bit to zero, even if you shift by zero bits. – John Flatness Oct 10 '11 at 21:16
  • 4
    Check this answer about *why* they use in this case the `>>>` operator: http://stackoverflow.com/questions/3081987/what-good-does-zero-fill-bit-shifting-by-0-do-a-0/3082073#3082073 – Christian C. Salvadó Oct 10 '11 at 21:46
  • 1
    JavaScript triple angle bracket – wprl Mar 24 '13 at 04:05
  • I saw that syntax in https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Array/find ```var length = list.length >>> 0;``` *(same use case as your one)* – Mars Robertson Jul 04 '16 at 11:19
  • 1
    Possible duplicate of [What is the JavaScript >>> operator and how do you use it?](https://stackoverflow.com/questions/1822350/what-is-the-javascript-operator-and-how-do-you-use-it) – Eric Jun 04 '18 at 23:39

4 Answers4

108

Ignoring its intended meaning, this is most likely where you'll see it used:


>>> 0 is unique in that it is the only operator that will convert any type to a positive integer:

"string"         >>> 0 == 0
(function() { }) >>> 0 == 0
[1, 2, 3]        >>> 0 == 0
Math.PI          >>> 0 == 3

In your example, var len = this.length >>> 0, this is a way of getting an integer length to use to iterate over this, whatever type this.length may be.


Similarly, ~~x can be used to convert any variable into a signed integer.

Eric
  • 87,154
  • 48
  • 211
  • 332
  • can you explain how to iterate using `>>>`? –  Aug 04 '17 at 13:14
  • 1
    @K48 I don't think he meant *iterate*, I think he meant to say this forces length to become a number. (Otherwise, I am equally confused.) But here's a great answer that elucidates more: https://stackoverflow.com/questions/1822350/what-is-the-javascript-operator-and-how-do-you-use-it – Mike Williamson Sep 27 '17 at 02:25
54

That's an unsigned right shift operator. Interestingly, it is the only bitwise operator that is unsigned in JavaScript.

The >>> operator shifts the bits of expression1 right by the number of bits specified in expression2. Zeroes are filled in from the left. Digits shifted off the right are discarded.

Joe
  • 73,764
  • 18
  • 123
  • 142
9

That operator is a logical right shift. Here the number is shifted 0 bits. A shift of zero bits mathemetically should have no effect.

But here it is used to convert the value to an unsigned 32 bit integer.

Mark Byers
  • 719,658
  • 164
  • 1,497
  • 1,412
3

>>> is a bit-wise operator, zero-fill right shift.

I think the only effect of >>> 0 on a positive number is to round down to the nearest integer, same as Math.floor(). I don't see why this would be necessary in your example, as generally a .length property (e.g. of an Array) would be an integer already.

I've also seen the slightly shorter ~~ used in the same way: ~~9.5 == 9; // true.

nrabinowitz
  • 52,936
  • 10
  • 139
  • 161
  • I doubt it is the same as `Math.abs()` when used for negative numbers. – Al Kepp Oct 10 '11 at 21:14
  • 6
    If you do `>>> 0` on a negative number it converts it to 2's compliment, then does the right shift. Therefore `-14 >>> 0 == 1073741820`. (http://msdn.microsoft.com/en-us/library/342xfs5s%28v=vs.94%29.aspx) – Rocket Hazmat Oct 10 '11 at 21:15
  • @AlKepp - yup, I saw the error and fixed it - should have tested first, but this was clearly a quick-draw question :). – nrabinowitz Oct 10 '11 at 21:20