>> mueve bits a la derecha, << mueve bits a la izquierda. Los dos trabajan con enteros de 32 bits, los valores son convertidos a enteros de 32 bits previamente.
Hay poca diferencia entre >> y >>>, ambos mueven los bits a la derecha pero >> agrega valores iguales al último bit a la izquierda y >>> siempre agrega 0s a la izquierda. El operador >>> también es el único operador que trabaja con enteros de 32 bits sin signo. La conversión del operando es diferente también. >> basicamente preserva el signo del número, mientras que >>> no. Fuera de eso (y la conversión de enteros mayores a 2^31 - 1) realizan la misma operación.
x[n] |= b
Es lo mismo que escribir:
x[n] = x[n] | b
El operador | realiza la operación OR bit a bit entre los dos operandos.
Respecto a tu programa, es mejor si lo descompones en partes:
len >> 5
Mueve len 5 bytes a la derecha. Es lo mismo que hacer:
Math.floor(len / 32);
Es decir, te regresa el cociente de la operación.
0x80 en binario es:
10000000
Len % 32 te regresa el residuo de la operación anterior (len / 32). El operador << mueve los bits a la izquierda. El resultado de esta operación siempre es 0 si el residuo es 25 o mayor, la operación OR que se realiza posteriormente señala una posible suma el resultado anterior: 1 ^ (7 + residuo) con el valor que se encuentra en el indice obtenido de len >> 5. Con la excepción que cuando el residuo es 25 o mayor se suma 0. También es importante mencionar que el valor regresado por << regresa un entero de 32 bits con signo, por lo que 1 << 31 (cuando el residuo es 24) regresa el valor negativo más grande que puede representar un entero de 32 bits (-2147483648). Esto es lo que hace tu tercer enunciado.