Дан массив из 8 байт. Рассматривая его, как массив из 64 бит, посчитать количество единиц - Assembler
Формулировка задачи:
кто может, напишите пожалуйста, с ассемблером беда(
2. Дан массив из 8 байт. Рассматривая его, как массив из 64 бит, посчитать количество единиц.
13. Дан массив из 3 байт. Рассматривая его, как массив из 24 бит, посчитать количество одиночных единиц в окружении нулей. Конец последовательности рассматривать как нуль.
Решение задачи: «Дан массив из 8 байт. Рассматривая его, как массив из 64 бит, посчитать количество единиц»
textual
Листинг программы
result:=popcnt(x)-popcnt(((x shl 1)and x)or((x shr 1)and x));
Объяснение кода листинга программы
- Задача: посчитать количество единиц в массиве из 8 байт, рассматривая его как массив из 64 бит.
- Используется функция popcnt (очевидно, это функция подсчета количества популяций), а также операции сдвига и побитового И.
- Выражение ((x shl 1)and x) означает, что мы сдвигаем x вправо на 1 позицию и затем применяем побитовую операцию И с самим x.
- Выражение ((x shr 1)and x) означает, что мы сдвигаем x влево на 1 позицию и затем применяем побитовую операцию И с самим x.
- Значение выражения (x shl 1)and x) равно количеству единиц в x, умноженному на 2 в степени 1 (т.е. 2).
- Значение выражения ((x shr 1)and x) равно количеству единиц в x, умноженному на 2 в степени -1 (т.е. 1/2).
- Разница между количеством единиц в x и количеством единиц в ((x shl 1)and x) равна количеству единиц в ((x shr 1)and x).
- Значение выражения (x shl 1)and x)or((x shr 1)and x) равно количеству единиц в x.
- Значение выражения popcnt(x)-popcnt(((x shl 1)and x)or((x shr 1)and x)) равно количеству единиц в x, умноженному на 2 в степени -1 (т.е. 1/2).
- Значение переменной result равно количеству единиц в x, умноженному на 2 в степени -1 (т.е. 1/2).