---
title: "Bitové operace"
description: "Bitové operace ve skriptu TapHome: GETBIT, GETBITS, GETBYTE, SETBYTE, SETBIT, SETBITS, převod BCD, šířka 8/16/32/64 bitů, bitový posun, bitové AND a OR s ekvivalenty v Excelu."
url: "https://taphome.com/cs/docs/script/bit-operations/"
language: cs
lastmod: 2026-11-06
generator: hugo
ai:
  topics: ["bit-operations","byte-manipulation","bitwise-operators","scripting-language"]
  questions: ["Jak v TapHome přečíst jeden bit z čísla?","Jak pomocí GETBYTE získat bajt z čísla?","Jak ve skriptu TapHome nastavit konkrétní bit nebo bajt?","Jak v TapHome provést bitový posun vlevo nebo vpravo?","Jak ve skriptech TapHome fungují bitové AND a OR?","Jaké jsou ekvivalenty bitových operátorů TapHome v Excelu?","Kolik bitů používají bitové funkce pro 16bitovou nebo 64bitovou hodnotu?","Jak převést číslo do BCD nebo z BCD?"]
---

# Bitové operace

Práce s bity a bajty ve skriptu TapHome — GETBIT, GETBITS, SETBIT, SETBITS, GETBYTE, SETBYTE, TOBCD, FROMBCD, šířka v bitech podle typu a bitové operátory s ekvivalenty v Excelu.

Poslední aktualizace: 2026-11-06

Tyto funkce čtou a mění jednotlivé bity, bitová pole a bajty celého čísla — typicky stavová slova a registry alarmů přečtené pomocí `MODBUSR`. Bit 0 je nejméně významný (nejpravější) bit a bajt 0 nejméně významný bajt.

## Šířka v bitech podle typu

Kolik bitů má číslo pro bitové funkce, závisí na jeho typu:

| Typ `number` | Bity | `bit` / `startBit` | `index` bajtu | Výsledek `GETBITS`, `SETBIT`, `SETBITS`, `SETBYTE` |
|---|---|---|---|---|
| `int8`, `uint8` | 8 | 0 – 7 | 0 | `uint` |
| `int16`, `uint16` | 16 | 0 – 15 | 0 – 1 | `uint` |
| `int64`, `uint64` | 64 | 0 – 63 | 0 – 7 | `uint64` |
| vše ostatní (`double`, `float`, `int`, `uint`, …) | 32 | 0 – 31 | 0 – 3 | `uint` |

- `MODBUSR`, číselné literály, `PARSEJSON` a hodnoty zařízení jsou `double`, takže se počítají jako 32 bitů. Jinou šířku mají jen typované proměnné, prvky kolekcí a 64bitové datové typy Modbus.
- Bit nebo bajt mimo typ je chyba, například `GETBIT(x, 16)` pro proměnnou `uint16`: *GETBIT - bit must be between 0 and 15*. Bitové pole, které **začíná** uvnitř typu, ale přesahuje jeho horní hranici, je povoleno — `GETBITS` vrátí bity, které existují, a `SETBITS` zbytek zahodí.
- `double` nebo `float` se zaokrouhlí na celé číslo a musí být mezi −2 147 483 648 a 4 294 967 295; cokoli jiného, včetně `NaN`, je chyba (*value X is out of the 32-bit range*). Záporné hodnoty používají dvojkový doplněk, takže `GETBITS(-1, 0, 16)` je `65535`.

**Dostupnost** — šířka podle typu vyžaduje TapHome Next 2026.1.40665+. Starší buildy považují každou hodnotu za 32bitovou: 64bitová hodnota ztratí horní polovinu a bit nad 8bitovým nebo 16bitovým typem vrátí `0`.

## GETBIT

`GETBIT` vrátí hodnotu jednoho bitu čísla, `0` nebo `1`.

```text
GETBIT(number, bit)
```

**Příklad**

```taphome
# přečte jeden bit ze zadaného čísla
GETBIT(2, 0);
# Result: 0
GETBIT(4, 2);
# Result: 1
# vyvolá chybu 3, pokud je bit 3 registru nastaven
IF(GETBIT(MODBUSR(H, 600, Uint16), 3) = 1, ADDERROR(3, "Overheating"));
```

## GETBITS

`GETBITS` vrátí bitové pole — `numberOfBits` bitů od `startBit` — jako celé číslo bez znaménka.

```text
GETBITS(number, startBit, numberOfBits)
```

**Parametry** — `numberOfBits` je 1 – 32, nebo 1 – 64 pro 64bitové `number`.

**Příklad**

```taphome
GETBITS(216, 3, 2);
# Result: 3 (216 = 0b11011000, bits 3 and 4 are 1)
GETBITS(0xFF, 0, 4);
# Result: 15
```

Datum a čas uložené po dvou bajtech v registru (Komfovent):

```taphome
VAR time := MODBUSR(H, 28, Uint16);
VAR date := MODBUSR(H, 30, Uint16);
GETBITS(time, 8, 8) + ":" + GETBITS(time, 0, 8) + " "
    + GETBITS(date, 0, 8) + "." + GETBITS(date, 8, 8) + "." + MODBUSR(H, 29, Uint16);
```

## SETBIT

`SETBIT` vrátí číslo s jedním bitem nastaveným na 0 (když je `value` 0) nebo na 1 (jakákoli jiná `value`).

```text
SETBIT(number, bit, value)
```

**Příklad**

```taphome
# nastaví bit 1 čísla 1 na 1, poté bit 2 čísla 4 na 0
SETBIT(1, 1, 1);
# Result: 3
SETBIT(4, 2, 0);
# Result: 0
# nastaví bit 40 64bitové proměnné a přečte ho zpět
uint64 alarms := 0;
alarms := SETBIT(alarms, 40, 1);
GETBIT(alarms, 40);
# Result: 1 (a 64-bit variable has bits 0 to 63)
```

## SETBITS

`SETBITS` vrátí číslo, v němž je bitové pole o `numberOfBits` bitech od `startBit` nahrazeno hodnotou `value`.

```text
SETBITS(number, startBit, numberOfBits, value)
```

**Příklad**

```taphome
SETBITS(192, 4, 2, 3);
# Result: 240
SETBITS(192, 5, 2, 3);
# Result: 224
```

**Chyby** — *Given number of bits (2) is not enought for storing the value 4.*, když se `value` do pole nevejde (hlášení je napsáno právě takto).

## GETBYTE

`GETBYTE` vrátí jeden bajt čísla (0 – 255) jako `uint`.

```text
GETBYTE(number, index)
```

**Příklad**

```taphome
# index 0 je nejnižší bajt, index 1 následující
GETBYTE(256, 0);
# Result: 0
GETBYTE(256, 1);
# Result: 1
# 259 je 0x0103, takže bajt 0 je 3
GETBYTE(259, 0);
# Result: 3
```

## SETBYTE

`SETBYTE` vrátí číslo, v němž je bajt na pozici `index` nahrazen hodnotou `value` (0 – 255).

```text
SETBYTE(number, index, value)
```

**Příklad**

```taphome
SETBYTE(256, 0, 255);
# Result: 511
SETBYTE(259, 1, 2);
# Result: 515
```

**Chyby** — *Given value (X) is bigger than maximum byte value.*; *Given value is less than 0.*

## TOBCD

`TOBCD` převede celé číslo na pakovaný BCD — každou desítkovou číslici do vlastních 4 bitů — a vrátí ho jako `uint`; zachová se až 8 číslic.

```text
TOBCD(number)
```

**Příklad**

```taphome
TOBCD(1234);
# Result: 4660 (0x1234)
```

## FROMBCD

`FROMBCD` převede pakovanou hodnotu BCD zpět na běžné číslo.

```text
FROMBCD(number)
```

**Příklad**

```taphome
FROMBCD(0x1234);
# Result: 1234
```

**Chyby** — *FROMBCD - number 26 is not in BCD format* a pozice číslice, když je skupina 4 bitů větší než 9 (zde `0x1A`).

## Bitové operátory a ekvivalenty v Excelu

Operátory pracují s celými čísly; operand `double` se nejprve převede na `int64` a operand `Null` dá `Null`. Úplný seznam a priority jsou na stránce [Operátory](https://taphome.com/cs/docs/script/operators/).

| Operátor | Příklad | Výsledek | Excel |
|---|---|---|---|
| `<<` bitový posun vlevo | `8 << 2` | `32` | `BITLSHIFT(number, shift_amount)` |
| `>>` bitový posun vpravo | `32 >> 2` | `8` | `BITRSHIFT(number, shift_amount)` |
| `&` bitové AND | `3 & 1` | `1` | `BITAND(number1, number2)` |
| `\|` bitové OR | `2 \| 1` | `3` | `BITOR(number1, number2)` |
| `^` bitový XOR | `5 ^ 1` | `4` | `BITXOR(number1, number2)` |

> [!WARNING]
> Bitové operátory váží volněji než porovnání: `a & 1 > 0` znamená `a & (1 > 0)`. Vždy používejte závorky.

```taphome
VAR status := MODBUSR(H, 5, Uint16);
IF((status & 0x04) > 0, "Door open", "Door closed");
```

Příklad bitových operací v [Google Sheets](https://docs.google.com/spreadsheets/d/1hF5FMpGMJbgYh-YLwWrq2n186_ATyGyLUb689__IhLY/edit?usp=sharing), nebo vyzkoušejte interaktivní nástroj na [bitwisecmd.com](http://bitwisecmd.com/).
