Побитовые операции над целыми числами
В компьютере целое число представлено в двоичном виде, как последовательность битов (цифр, которые равны либо нулю, либо единице). Понятийно последовательность битов бесконечна слева, причём старшие биты либо все нули, либо все единицы. Побитовая операция действует на отдельные биты такой последовательности. Например, сдвиг перемещает всю последовательность влево или вправо на одну или несколько позиций, воспроизводя тот же узор, смещённый.
Побитовые операции в Emacs Lisp применяются только к целым числам.
- Функция: ash целое1 количество
-
ash(арифметический сдвиг) сдвигает биты в целое1 влево на количество позиций или вправо, если количество отрицательное. Левые сдвиги вводят нулевые биты справа; правые сдвиги отбрасывают самые правые биты. Рассматривая операцию как целочисленную,ashумножает целое1 на 2количество, а затем преобразует результат в целое число, округляя вниз, в сторону минус бесконечности.Вот примеры
ash, сдвига узора битов влево и вправо на одну позицию. Эти примеры показывают только младшие биты двоичного узора; старшие биты согласуются со старшим показанным битом. Как видно, сдвиг влево на одну позицию эквивалентен умножению на два, а сдвиг вправо на одну позицию эквивалентен делению на два с последующим округлением в сторону минус бесконечности.(ash 7 1) ⇒ 14 ;; Decimal 7 becomes decimal 14. …000111 ⇒ …001110(ash 7 -1) ⇒ 3 …000111 ⇒ …000011(ash -7 1) ⇒ -14 …111001 ⇒ …110010(ash -7 -1) ⇒ -4 …111001 ⇒ …111100Вот примеры сдвига влево или вправо на две позиции:
; binary values (ash 5 2) ; 5 = …000101 ⇒ 20 ; = …010100 (ash -5 2) ; -5 = …111011 ⇒ -20 ; = …101100
(ash 5 -2) ⇒ 1 ; = …000001(ash -5 -2) ⇒ -2 ; = …111110
- Функция: lsh целое1 количество
-
lsh, что является сокращением от логического сдвига, сдвигает биты в целое1 влево на количество позиций или вправо, если количество отрицательное, заполняя освободившиеся биты нулями. Если количество отрицательное, то целое1 должно быть либо fixnum, либо положительным bignum, иlshобрабатывает отрицательное fixnum так, как будто оно беззнаковое, вычитая дваждыmost-negative-fixnumперед сдвигом, получая неотрицательный результат. Это странное поведение восходит к тому времени, когда Emacs поддерживал только fixnums; в наши дниashявляется лучшим выбором.Так как
lshведет себя какashза исключением случаев, когда целое1 и количество оба отрицательные, следующие примеры сосредоточены на этих исключительных случаях. Эти примеры предполагают 30-битные fixnums.; binary values (ash -7 -1) ; -7 = …111111111111111111111111111001 ⇒ -4 ; = …111111111111111111111111111100 (lsh -7 -1) ⇒ 536870908 ; = …011111111111111111111111111100
(ash -5 -2) ; -5 = …111111111111111111111111111011 ⇒ -2 ; = …111111111111111111111111111110 (lsh -5 -2) ⇒ 268435454 ; = …001111111111111111111111111110
- Функция: logand &rest ints-or-markers
-
Эта функция возвращает побитовую конъюнкцию аргументов: n-й бит результата равен 1 тогда и только тогда, когда n-й бит во всех аргументах равен 1.
Например, используя 4-битные двоичные числа, побитовая конъюнкция 13 и 12 равна 12: 1101 в сочетании с 1100 даёт 1100. В обоих двоичных числах два старших бита равны 1, поэтому два старших бита возвращаемого значения равны 1. Однако, для двух младших битов, каждый из них равен 0 по крайней мере в одном из аргументов, поэтому два младших бита возвращаемого значения равны 0.
Следовательно,
(logand 13 12) ⇒ 12Если
logandне получает никаких аргументов, то возвращает значение -1. Это число является тождественным элементом дляlogand, так как его двоичное представление состоит целиком из единиц. Еслиlogandполучает только один аргумент, то возвращает этот аргумент.; binary values (logand 14 13) ; 14 = …001110 ; 13 = …001101 ⇒ 12 ; 12 = …001100
(logand 14 13 4) ; 14 = …001110 ; 13 = …001101 ; 4 = …000100 ⇒ 4 ; 4 = …000100
(logand) ⇒ -1 ; -1 = …111111
- Функция: logior &rest ints-or-markers
-
Эта функция возвращает побитовое включительно ИЛИ своих аргументов: n-й бит результата равен 1 тогда и только тогда, когда n-й бит равен 1 по крайней мере в одном из аргументов. Если нет аргументов, результат равен 0, что является тождественным элементом для этой операции. Если
logiorполучает только один аргумент, то возвращает этот аргумент.; binary values (logior 12 5) ; 12 = …001100 ; 5 = …000101 ⇒ 13 ; 13 = …001101
(logior 12 5 7) ; 12 = …001100 ; 5 = …000101 ; 7 = …000111 ⇒ 15 ; 15 = …001111
- Функция: logxor &rest ints-or-markers
-
Эта функция возвращает побитовую исключительную ДИЗЬЮНКЦИЮ своих аргументов: n-й бит результата равен 1 тогда и только тогда, когда n-й бит равен 1 в нечётном количестве аргументов. Если нет аргументов, результат равен 0, что является тождественным элементом для этой операции. Если
logxorполучает только один аргумент, то возвращает этот аргумент.; binary values (logxor 12 5) ; 12 = …001100 ; 5 = …000101 ⇒ 9 ; 9 = …001001
(logxor 12 5 7) ; 12 = …001100 ; 5 = …000101 ; 7 = …000111 ⇒ 14 ; 14 = …001110
- Функция: lognot целое
-
Эта функция возвращает побитовое дополнение своего аргумента: n-й бит результата равен 1 тогда и только тогда, когда n-й бит в целом равен 0, и наоборот. Результат равен -1 - целое.
(lognot 5) ⇒ -6 ;; 5 = …000101 ;; becomes ;; -6 = …111010
- Функция: logcount целое
-
Эта функция возвращает вес Хэмминга целого: количество единиц в двоичном представлении целого. Если целое отрицательное, возвращает количество нулевых битов в его двоичном представлении в дополнении до двух. Результат всегда неотрицательный.
(logcount 43) ; 43 = …000101011 ⇒ 4 (logcount -43) ; -43 = …111010101 ⇒ 3
Copyright © 1990-1996, 1998-2022 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Bitwise-Operations.html