Идея того, что происходит, заключается в следующем. Предположим, что данные [c]> 128. Если это так, то выполнение данных [c] - 128 приводит к положительному числу (т. Е. Знаковый бит равен 0). Смещение этого права 31 раз приводит к числу, которое равно 0s в двоичном формате. Таким образом, t = 00000000000000000000000000000000.
Теперь, когда мы делаем ~ t, он становится все 1 и &, что с данными [c] просто дает нам данные [c] снова. Теперь мы добавляем это к сумме и работает так же, как и раньше.
Но что, если данные [c] < 128? Ну, это означает, что данные [c] - 128 отрицательны, давая 1 как знаковый бит. Это означает, что t = 11111111111111111111111111111111. Таким образом, ~ t - все 0s. & -определение всех 0 с данными [c] просто возвращает все 0s (т. Е. 0 в десятичном виде). Добавление 0 к сумме не меняет его, так что все хорошо.
StackOverflow был бы немного лучше. Возможно, какой-то модератор перенесет это для вас. Ото, я уверен, что на этом сайте тоже будет дан ответ. – Mawg
BTW, который выглядит как небезопасный/незарегистрированный код, так как это >> 31 делает предположение о числе бис в целых числах. Кроме того, если код трудно понять, тогда его будет сложно поддерживать, поэтому лучше избегайте причудливых вещей (конечно, вы ищете объяснение здесь, но я рекомендую ваш собственный код KISSes) – Mawg
@Mawg это не код, который Я скопирую пасту. Я только что прочитал этот интересный ответ на этот интересный вопрос, где это изменение было предложено, и я хотел бы знать, как это работает – Libathos