&

& — Bitwise AND operator.

Description

The bitwise operators perform operations of bitwise AND, bitwise OR, bitwise NOT and bitwise non-equivalence.

Syntax

a & b  (bitwise AND)

where the arguments a and b may be further expressions. They are converted to the nearest integer to machine precision and then the operation is performed.

Performance

The priority of these operators is less binding that the arithmetic ones, but more binding that the comparisons.

Parentheses may be used as above to force particular groupings.

Examples

Here is an example of the bitwise AND and OR operators. It uses the file bitwise.csd.

Example 37. Example of the bitwise operators.

See the sections Real-time Audio and Command Line Flags for more information on using command line flags.

<CsoundSynthesizer>
<CsOptions>
</CsOptions>
<CsInstruments>

sr = 44100
ksmps = 32
nchnls = 2

instr 1
iresultOr = p4 | p5
iresultAnd = p4 & p5
prints "%i | %i  = %i\\n", p4, p5, iresultOr
prints "%i & %i  = %i\\n", p4, p5, iresultAnd
endin


instr 2 ; decimal to binary converter
Sbinary = ""
inumbits = 8
icount init inumbits - 1

pass:

	ivalue = 2 ^ icount
	if (p4 & ivalue >= ivalue) then
		Sdigit = "1"
	else
		Sdigit = "0"
	endif
	Sbinary strcat Sbinary, Sdigit

loop_ge icount, 1, 0, pass

Stext sprintf "%i is %s in binary\\n", p4, Sbinary
prints Stext
endin

</CsInstruments>
<CsScore>
i 1 0 0.1  1  2
i 1 +  .   1  3
i 1 +  .   2  4
i 1 +  .   3  10

i 2 2 0.1   12
i 2 +  .    9
i 2 +  .    15
i 2 +  .    49

e
</CsScore>
</CsoundSynthesizer>


Here is an example for the bitwise-group, comparing the different bitwise opcodes. It uses the file bitwise-group.csd.

Example 38. Example of the bitwise group.

<CsoundSynthesizer>
<CsOptions>
--nosound
</CsOptions>
<CsInstruments>

sr     =    44100
ksmps  =    32
nchnls =    2
0dbfs  =    1

; By Daniele Cucchi - 2020

;a & b: bitwise AND
;a | b: bitwise OR
;a # b: bitwise NON EQUIVALENCE - XOR
; ~ a: bitwise NOT

instr 1

kArrayA[] fillarray 0, 0, 1, 1  ; Fill array "A" with 4 values: 0, 0, 1, 1
i0A = i(kArrayA, 0)
i1A = i(kArrayA, 1)
i2A = i(kArrayA, 2)
i3A = i(kArrayA, 3)

kArrayB[] fillarray 0, 1, 0, 1  ; Fill array "B" with 4 values: 0, 1, 0, 1
i0B = i(kArrayB, 0)
i1B = i(kArrayB, 1)
i2B = i(kArrayB, 2)
i3B = i(kArrayB, 3)

; Bitwise operations & fill arrays
kAND[] = kArrayA & kArrayB
kOR[] = kArrayA | kArrayB
kNON[] fillarray i0B # i0A, i1B # i1A, i2B # i2A, i3B # i3A
kNOT[] fillarray  ~ i0A, ~ i1A, ~ i2A, ~ i3A

; Print values 
printarray kAND, "%d", "= bitwise AND"
printarray kOR, "%d", "= bitwise OR"
printarray kNON, "%d", "= bitwise NON"
printarray kNOT, "%d", "= bitwise NOT\n"

endin

</CsInstruments>
<CsScore>
i1 0 1
e
</CsScore>
</CsoundSynthesizer>


See also

Arithmetic and Logic Operations