This вопрос дает объяснение о SWAR algorithm, используемый для подсчета числа 1 с в заданном номере. В то время как объяснения ilmari написал 0x01010101 = (1 < < 24) + (1 < < 16) + (1 < < 8) + 1. Может кто-то объяснить, насколько он равен.Как 0x01010101 эквивалентен 1 << 24 + 1 << 16 + 1 << 8 + 1
0
A
ответ
0
Прежде всего вам нужно будет понять, что делает оператор <<
. Он выполняет побитовый сдвиг влево. Давайте принять 0b
префикс для двоичной системы счисления и 0x
для гексадецималов:
1 << 8 = 0b100000000 = 256 = 0x100
Аналогично:
1 << 16 = 0b10000000000000000 = 65536 = 0x10000
Итак:
(1 << 8) + (1 << 16) = 0x10100
Добавляя (1 << 24)
и 1
, вы получите Конечный результат: 0x01010101
.
Обратите внимание, что, хотя он выглядит очень много, как двоичное значение, он является шестнадцатеричным. Если мы напишем его как двоичный, мы получим:
0b1000000010000000100000001
^ ^ ^ ^
bit #24 bit #16 bit #8 bit #0
2
1 0000 0000 0000 0000 0000 0000 Shifting 1 left by 24 places
1 0000 0000 0000 0000 Shifting 1 left by 16 places
1 0000 0000 Shifting 1 left by 8 places
1
================================
1 0000 0001 0000 0001 0000 0001 Result after adding
I.e. 0x01010101.
1
Давайте начнем с общим числом:
Hex: 0x01010101
Decimal: 16843009
Binary: 1000000010000000100000001
Теперь посмотрим на них в индивидуальном порядке. Начните с 1 << 24
(ака 1 left shifted 24 раз, иначе двоичный 1 с 24 нулями..):
Calculation: 1 << 24
Decimal: 16777216
Binary: 1000000000000000000000000
// ^25th position because 1 was shifted 24 times to the left
Calculation: 1 << 16
Decimal: 65536
Binary: 0000000010000000000000000
// ^17th position because 1 was shifted 16 times to the left
Calculation: 1 << 8
Decimal: 256
Binary: 0000000000000000100000000
// ^9th position because 1 was shifted 8 times to the left
1 очевидна, поэтому я не буду включать это. Теперь добавьте их все вместе:
1000000000000000000000000 = 1 << 24
0000000010000000000000000 = 1 << 16
0000000000000000100000000 = 1 << 8
+ 0000000000000000000000001 = 1
|-------|-------|-------|
1000000010000000100000001 = 16843009
А потом мы вернулись на старт, 16843009
в шестнадцатеричном является 0x01010101
.
Смежные вопросы
- 1. Как работает 1 << 64 - 1?
- 2. Описание 1 << 16 | 10?
- 3. GNUPLOT 5.0 "lt -1 lt -1" unrecognized
- 4. В Java, при использовании бит-сдвигов, почему 1 << 32! = 1 << 31 << 1?
- 5. Почему (1 <1 <1) возвращает true в C++?
- 6. оператор <<: std :: cout << i << (i << 1);
- 7. Что это означает «/ * перегруженные элементы данных типов */#define OE_IS_ARRAY (1 << 0) #define OE_IS_OBJECT \t (1 << 1) #define OE_IS_METHOD \t (1 << 2)"?
- 8. Почему максимальная емкость Java HashMap 1 << 30, а не 1 << 31?
- 9. - VAR | = 1 << 2; reverisble?
- 10. Почему System.out.println (-1 << 32) = - 1 в Java?
- 11. <сценарии состояние = «1 = 1»><[CDATA [
- 12. Значение ((поплавок) рандов()/(флоат) ((1 << 31) - 1))
- 13. Что означает «(a << 24 | b << 16 | c << 8 | d)» означает?
- 14. MathJax отображение $ 1 <х <2 $
- 15. Что такое 1 << 0?
- 16. Оценка выражения 1 <= месяц <= 12
- 17. Что означает «<< 1 в Javascript?
- 18. Непосредственно (НЕ итеративна) максимизация (1 << п) при условии (а & ~ ((1 << n) - 1)) > = Ь
- 19. Зачем использовать 1 << 4 вместо 16?
- 20. Что означает «while (1 << n) <self.top:» означает?
- 21. cout << (1000 <pow (10,3)) << endl; дает 1
- 22. Обратное битового сдвига влево в формате 1 << п
- 23. Как сделать (1 << 9) пройти MISRA?
- 24. Почему (~ (1 << 31)) === ~ (1 << 31), но они не равны при преобразовании в строки?
- 25. Почему -1 << 23 и -1 << 55 возвращают одно и то же значение в Java?
- 26. Почему `1 << 32` и` int i = 32; 1 << i` показать другой результат? Это ошибка или функция?
- 27. unsigned long 0 <-1?
- 28. Что делает 1 <& - & mean?
- 29. -2 <1 = false. Зачем?
- 30. 0 <0 -1 истинно?