& — Bitwise AND operator.
The bitwise operators perform operations of bitwise AND, bitwise OR, bitwise NOT and bitwise non-equivalence.
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.
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.
Here is an example of the bitwise AND and OR operators. It uses the file bitwise.csd.
Example 36. 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 37. 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>