### How it works

The Instruction operation "arithmetic" can be used to work on more complex arithmetic expressions than a single add or subtract, using common mathematical expression handling (also known as 'infix' notation.) Either floating point decimal numbers, or hexadecimal numbers may be used (prefix hexadecimal with 0x).

### "Arithmetic" Examples

The example below shows how the 'name' attribute is used for variable substitution.

``````<instruction operation="arithmetic">
<input value="(x+y)*3-2" />
<input name="x" value="4" />
<input name="y" value="3" />
</instruction>``````
`19`

Here is a list of operators that the arithemetic expression handler understands:

1. * (multiply)
3. - (subtract/unary minus)
4. / (divide)
5. \ (quotient)
6. % (modulo)

Here is a list of functions that the arithemetic expression handler understands, that take 2 parameters:

1. pow() power function
2. max() maximum function
3. min() minimum function
4. xor() (bitwise exclusive or function)
5. and() (bitwise and function)
6. or() (bitwise or function)
``````<instruction operation="arithmetic" note="example using 2 parameter functions.">
<input value="and(max(pow(x,y),pow(y,x)),0x33)" />
<input name="x" value="4" />
<input name="y" value="3" />
</instruction>``````
`17`

Here is a list of functions that the arithemetic expression handler understands, that take 1 parameter:

1. not (bitwise not function)
2. round (round to integer function)
3. floor (nearest lower integer function)
4. ceil (nearest upper integer function)
5. abs (absolute function)
``````<instruction operation="arithmetic" note="example using 1 parameter functions.">
<input value="not(ceil(x)+floor(y))" />
<input name="x" value="4.133" />
<input name="y" value="3.013" />
</instruction>``````
`-9`

Here is a list of functions that the arithemetic expression handler understands, that take 3 parameters:

1. rol (rotate bits left function with wordsize)
2. ror (rotate bits right function with wordsize)

Note that any bits outside of the word length are not touched!

``````<instruction operation="arithmetic" note="rotate 7 bits left on an 8 bit word.">
<input value="rol(x,7,8)" />
<input name="x" value="43" />
</instruction>``````
`149`

Note that below we are outputting the result in base 16, using the precision attribute.

``````<instruction precision="b16" operation="arithmetic" note="flip lowest bit using 2-bit word.">
<input value="rol(x,1,2)" />
<input name="x" value="0x55" />
</instruction>``````
`56`