In LISP, for an arithmetic shift, the ash function is used. If the count is positive it shifts the bits to left, else if the count is negative it does the right shift.
Syntax : ash number count
Example:
sh 10 5; arithmetic left shift
ash 10 -5; arithmetic right shift
Lisp
;set value of variable val1 to 10
(setq val1 10)
;set value of variable val2 to 5
(setq val2 5)
; arithmetic left shift
(print (ash val1 val2))
; arithmetic right shift
(print (ash val1 (-val2)))
Output :
320
0
Bitwise Operators in LISP
In this article, we will discuss the Bitwise operators in LISP. These operators are used to perform the manipulation of individual bits of a number. The truth table for bitwise AND, NAND, OR, XOR, NOR, & XNOR:
a
b
a and b
a nand b
a or b
a xor b
a nor b
a xnor b
0
0
0
1
0
0
1
1
0
1
0
1
1
1
0
0
1
1
1
0
1
0
0
1
1
0
0
1
1
1
0
0
Different bitwise operators in LISP are listed below in the tabular form
Operator
Syntax
Description
logand
(logand num1 num2)
The operator returns bitwise logical AND of two numbers
logior
(logior num1 num2)
The operator returns bitwise Inclusive OR of two numbers
logxor
(logxor num1 num2)
The operator returns bitwise Exclusive OR of two numbers
lognor
(lognor num1 num2)
The operator returns bitwise NOT of two numbers
logeqv
(logeqv num1 num2)
The operator returns bitwise Exclusive NOR of two numbers
logcount
(logcount num1)
The operator returns the number of ones in the binary representation of the integer
Let’s understand each operator one by one.
logand: It takes two numbers as operands and does logical AND on every bit of two numbers and returns it, If no operands are given then the result is -1
a = 5 = 0101 (In Binary)
b = 7 = 0111 (In Binary)
logand Operation of 5 and 7
0101
0111
________
= 0101 = 5 (In decimal)
Lisp
;set value of variable val1 to 5
(setq val1 5)
;set value of variable val2 to 7
(setq val2 7)
;; logand operator
(print (logand val1 val2))
logior: The operator returns bitwise Inclusive OR of the arguments that are passed, If only a single argument is passed it will return the argument itself
a = 5 = 0101 (In Binary)
b = 7 = 0111 (In Binary)
logior Operation of 5 and 7
0101
0111
________
= 0111 = 7 (In decimal)
Lisp
;set value of variable val1 to 5
(setq val1 5)
;set value of variable val2 to 7
(setq val2 7)
;; logior operator
(print (logior val1 val2))
logxor: It returns the bitwise Exclusive OR of its arguments, if no arguments are passed it returns 0
a = 5 = 0101 (In Binary)
b = 7 = 0111 (In Binary)
logxor Operation of 5 and 7
0101
^ 0111
________
= 0010 = 2 (In decimal)
Lisp
;set value of variable val1 to 5
(setq val1 5)
;set value of variable val2 to 7
(setq val2 7)
;; logxor operator
(print (logxor val1 val2))
lognor: The operator returns bitwise NOT of its arguments, if no arguments are passed it returns -1
a = 5 = 0101 (In Binary)
b = 7 = 0111 (In Binary)
lognor Operation of 5 and 7
0101
0111
_________
= -(1000) = -8 in decimal
Lisp
;set value of variable val1 to 5
(setq val1 5)
;set value of variable val2 to 7
(setq val2 7)
;; lognor operator
(print (lognor val1 val2))
logeqv: The operator takes two arguments and does Exclusive Nor(i.e. Logical Equivalence) of those arguments, if no arguments are given then it returns -1
a = 5 = 0101 (In Binary)
b = 7 = 0111 (In Binary)
logeqv Operation of 5 and 7
0101
0111
________
= 1101 XNOR is just inversion of XOR
Lisp
;set value of variable val1 to 5
(setq val1 5)
;set value of variable val2 to 7
(setq val2 7)
;; logeqv operator
(print (logeqv val1 val2))
logcount: The operator counts the number of bits in an integer, If the number is positive then 1-bits are counted, if it’s negative then 0-bits in two’s complement are counted.
a = 7 = 0111 (in Binary)
logcount Operation of 5
= 0111
^^^ there are three 1-bits
Hence the logcount of 7 will return 3