Смущает этот момент:
JS:
if (s[0] = v, s[16] = s[1] = s[2] = s[3] = s[4] = s[5] = s[6] = s[7] = s[8] = s[9] = s[10] = s[11] = s[12] = s[13] = s[14] = s[15] = 0) { ... }
PHP:
if ($s[0] = $v and $s[16] = $s[1] = $s[2] = $s[3] = $s[4] = $s[5] = $s[6] = $s[7] = $s[8] = $s[9] = $s[10] = $s[11] = $s[12] = $s[13] = $s[14] = $s[15] = 0) { ... }
Кажется что "запятая" в JS и "and" в PHP сработают по разному.
Попробуйте
if ($s[0] = $v and $s[16] = $s[1] = $s[2] = $s[3] = $s[4] = $s[5] = $s[6] = $s[7] = $s[8] = $s[9] = $s[10] = $s[11] = $s[12] = $s[13] = $s[14] = $s[15] = 0) {
Заменить на
$s[0] = $v;
if ($s[16] = $s[1] = $s[2] = $s[3] = $s[4] = $s[5] = $s[6] = $s[7] = $s[8] = $s[9] = $s[10] = $s[11] = $s[12] = $s[13] = $s[14] = $s[15] = 0) {
PS. Ниже в комментариях показал строчку из программы с битовыми операциями, дающий разный результат на js и php, что является дополнительной проблемой вносящей ошибку.