Нужна помощь в понимании использования побитовых операторов - PullRequest
9 голосов
/ 09 августа 2011

Я унаследовал некоторый код и не могу разобраться с ним:

byte[] b = new byte[4] { 3, 2, 5, 7 };
int c = (b[0] & 0x7f) << 24 | b[1] << 16 | b[2] << 8 | b[3];

Может кто-нибудь сказать, что здесь происходит?

Ответы [ 2 ]

20 голосов
/ 09 августа 2011

В основном он преобразует младшие 31 бит 4-байтового массива в целое число, используя преобразование с прямым порядком байтов .

Таким образом, байтовый массив {0, 0, 0, 1} будет преобразован в 1; байтовый массив {0, 0, 1, 0} будет преобразован в 256 и т. д.

Это делается через смесь битовых операторов:

5 голосов
/ 10 августа 2011

не делали бит-математику за минуту, так что ... для удовольствия:
[дополнительные скобки, чтобы показать порядок операций]

((b[0] & 0x7f) << 24) | (b[1] << 16) | (b[2] << 8) | b[3]

(b[0] & 0x7f) << 24 =  11 0000 0000 0000 0000 0000 0000
b[1] << 16 = . . . . . . . . . . 10 0000 0000 0000 0000
b[2] << 8 = . . . . . . . . . . . . . . . 101 0000 0000
b[3] = .  .  .  .  .  .  .  .  .  .  .  .  .  .  . 0111

теперь ИЛИ все вместе, и вы получите

0011 0000 0010 0000 0101 0000 0111 = 50,464,007
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...