> For the complete documentation index, see [llms.txt](https://docs.monokot.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.monokot.io/scripts/programming-examples/how-to-inverting-bits.md).

# How to: Inverting Bits

The guide demonstrates how to create an expression that will invert the bits of a given tag. Before starting, create a local Modbus device, a tag with the name *source\_tag* and data format WORD (16-bit unsigned integer).

Open *Monokot Server Administrator*, double-click *Scripts* on the *Server Explorer* pane and go to the *Modules* tab. Click the *New Module* button and name the module *BitsOp*. Insert the following code into the code editor:

```javascript
function bit_test(num, bit){
    return ((num>>bit) % 2 != 0)
}

function bit_set(num, bit){
    return num | 1<<bit;
}

function bit_clear(num, bit){
    return num & ~(1<<bit);
}

function bit_toggle(num, bit){
    return bit_test(num, bit) ? bit_clear(num, bit) : bit_set(num, bit);
}
```

Press *Ctrl + Enter* to apply the change in the code editor.

![](/files/yQ7AorchsnimCLfAA05d)

Thus, the following functions are defined in the *BitsOp* module:

* **bit\_test:** returns the state (true or false) of the bit number *bit* from the number *num*
* **bit\_set:** sets the bit number *bit* of the specified number *num* to true and returns the resulting number
* **bit\_clear:** resets the bit number *bit* of the specified number *num* to false and returns the resulting number
* **bit\_toggle:** inverts the bit number *bit* of the specified number *num* and returns the resulting number

Go to the *Expressions* tab and click the *New Expression* button. For the expression that appeared, set the name *Inverse* and specify the data type WORD (16-bit unsigned integer). Insert the following code into the expression code editor:

```javascript
const NUMBER_OF_BIT = 16;

var value = context.data['source_tag_trig'].state.value;

for (var i = 0; i < NUMBER_OF_BIT; i++)
  value = bit_toggle(value, i);

return value;
```

Press *Ctrl + Enter* to apply the change in the code editor.

While in the code editor you can check the syntax by pressing the F9 key

Go to the *Triggers* tab and click *Add Data*.... Select the previously created tag (*source\_tag*) as the data source for the trigger. Enter *source\_tag\_trig* as the name (key) of the trigger.

![](/files/f3XXb9JSbGEhFzgltR58)

&#x20;Go to the *Imports* tab and click the checkbox of the *BitsOp* module.

![](/files/OwFkgEh2h1Sz9jseorX8)

In order for the changes to take effect on the server, click the Sync button. If you switch to *Go Online* mode, you will see a picture similar to the following (in my case, the number *21845* is inverted).&#x20;

![](/files/86Mi5O6ZtKiWY428roPN)
