2014-11-12 4 views
0

Я не знаю, если это правильный сайт SE для размещения, но я буду стараться в любом случае, из этого answer .Она предположило, что этоОбъяснение кода

if (data[c] >= 128) 
    sum += data[c]; 

может превратиться в это:

int t = (data[c] - 128) >> 31; 
sum += ~t & data[c]; 

Может кто-нибудь объяснить мне, как это будет работать?

+0

StackOverflow был бы немного лучше. Возможно, какой-то модератор перенесет это для вас. Ото, я уверен, что на этом сайте тоже будет дан ответ. – Mawg

+2

BTW, который выглядит как небезопасный/незарегистрированный код, так как это >> 31 делает предположение о числе бис в целых числах. Кроме того, если код трудно понять, тогда его будет сложно поддерживать, поэтому лучше избегайте причудливых вещей (конечно, вы ищете объяснение здесь, но я рекомендую ваш собственный код KISSes) – Mawg

+0

@Mawg это не код, который Я скопирую пасту. Я только что прочитал этот интересный ответ на этот интересный вопрос, где это изменение было предложено, и я хотел бы знать, как это работает – Libathos

ответ

3

Идея того, что происходит, заключается в следующем. Предположим, что данные [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 к сумме не меняет его, так что все хорошо.

Смежные вопросы