Вы суммируете неправильные биты, потому что +
имеет более высокий приоритет, чем >>
, в этих строках:
b = result + result >> 8;
b = b + result >> 16;
b = b + result >> 24;
Предположим, что result == 0x01020304
:
- Выражение
result + result >> 8
приведет к 0x01020304 + 0x01020304 >> 8
, затем 0x02040608 >> 8
и, наконец, 0x020406
.
- Выражение
b = b + result >> 16
приведет к 0x020406 + 0x01020304 >> 16
, затем 0x0104070A >> 16
и, наконец, 0x010407
.
- Выражение
b = b + result >> 24
приведет к 0x010407 + 0x01020304 >> 24
, затем 0x0103070B >> 24
и, наконец, 0x010307
.
- В конце выражения
b&0xff
приводит к 0x07
. Не результат 0x0A
или 10, которые мы ожидали.
Таким образом, вы должны:
- Убедитесь, что сдвиг сделан перед сложением. Используйте скобки
()
.
- Маскируйте ненужные биты с помощью
& 0xFF
. Обратите внимание, что это не является строго необходимым, поскольку есть b&0xff
, но, на мой взгляд, это делает намерение более ясным.
* * Пример тысячу сорок четыре: * * 1045
b = (result & 0xFF) + (result >> 8 & 0xFF);
b = b + (result >> 16 & 0xFF);
b = b + (result >> 24 & 0xFF);