---
title: "Operacje bitowe"
description: "Operacje bitowe w skryptach TapHome: GETBIT, GETBITS, GETBYTE, SETBYTE, SETBIT, SETBITS, konwersja BCD, szerokość 8/16/32/64 bitów, przesunięcie bitowe, bitowe AND i OR z odpowiednikami w Excelu."
url: "https://taphome.com/pl/docs/script/bit-operations/"
language: pl
lastmod: 2026-11-06
generator: hugo
ai:
  topics: ["bit-operations","byte-manipulation","bitwise-operators","scripting-language"]
  questions: ["Jak odczytać pojedynczy bit z liczby w TapHome?","Jak wyodrębnić bajt z liczby funkcją GETBYTE?","Jak ustawić określony bit lub bajt w skrypcie TapHome?","Jak wykonać przesunięcie bitowe w lewo lub w prawo w TapHome?","Jak działają bitowe AND i OR w skryptach TapHome?","Jakie są odpowiedniki operatorów bitowych TapHome w Excelu?","Ilu bitów używają funkcje bitowe dla wartości 16-bitowej lub 64-bitowej?","Jak przekonwertować liczbę na BCD lub z BCD?"]
---

# Operacje bitowe

Operacje na bitach i bajtach w skryptach TapHome — GETBIT, GETBITS, SETBIT, SETBITS, GETBYTE, SETBYTE, TOBCD, FROMBCD, szerokość bitowa według typu i operatory bitowe z odpowiednikami w Excelu.

Ostatnia aktualizacja: 2026-11-06

Te funkcje odczytują i zmieniają pojedyncze bity, pola bitowe i bajty liczby całkowitej — zwykle słowa statusu i rejestry alarmów odczytane funkcją `MODBUSR`. Bit 0 to najmniej znaczący (skrajnie prawy) bit, a bajt 0 to najmniej znaczący bajt.

## Szerokość bitowa według typu

Ile bitów ma liczba dla funkcji bitowych, zależy od jej typu:

| Typ `number` | Bity | `bit` / `startBit` | `index` bajtu | Wynik `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` |
| wszystko inne (`double`, `float`, `int`, `uint`, …) | 32 | 0 – 31 | 0 – 3 | `uint` |

- `MODBUSR`, literały dziesiętne, `PARSEJSON` i wartości urządzeń są typu `double`, więc liczą się jako 32 bity. Inną szerokość mają tylko zmienne z typem, elementy kolekcji i 64-bitowe typy danych Modbus.
- Bit lub bajt poza typem to błąd, na przykład `GETBIT(x, 16)` dla zmiennej `uint16`: *GETBIT - bit must be between 0 and 15*. Pole bitowe, które **zaczyna się** wewnątrz typu, ale sięga ponad jego górną granicę, jest dozwolone — `GETBITS` zwraca istniejące bity, a `SETBITS` odrzuca resztę.
- `double` lub `float` jest zaokrąglany do liczby całkowitej i musi mieścić się między −2 147 483 648 a 4 294 967 295; wszystko inne, łącznie z `NaN`, to błąd (*value X is out of the 32-bit range*). Wartości ujemne używają kodu uzupełnień do dwóch, więc `GETBITS(-1, 0, 16)` daje `65535`.

**Dostępność** — szerokość według typu — wymagana wersja: TapHome Next 2026.1.40665+. Starsze kompilacje traktują każdą wartość jako 32-bitową: wartość 64-bitowa traci górną połowę, a bit powyżej typu 8- lub 16-bitowego zwraca `0`.

## GETBIT

`GETBIT` zwraca wartość jednego bitu liczby, `0` lub `1`.

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

**Przykład**

```taphome
# odczytuje pojedynczy bit podanej liczby
GETBIT(2, 0);
# Result: 0
GETBIT(4, 2);
# Result: 1
# zgłasza błąd 3, gdy bit 3 rejestru jest ustawiony
IF(GETBIT(MODBUSR(H, 600, Uint16), 3) = 1, ADDERROR(3, "Overheating"));
```

## GETBITS

`GETBITS` zwraca pole bitowe — `numberOfBits` bitów od `startBit` — jako liczbę całkowitą bez znaku.

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

**Parametry** — `numberOfBits` wynosi 1 – 32, albo 1 – 64 dla 64-bitowej `number`.

**Przykład**

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

Data i czas zapisane jako dwa bajty na rejestr (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` zwraca liczbę z jednym bitem ustawionym na 0 (gdy `value` wynosi 0) albo na 1 (każda inna `value`).

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

**Przykład**

```taphome
# ustawia bit 1 liczby 1 na 1, potem bit 2 liczby 4 na 0
SETBIT(1, 1, 1);
# Result: 3
SETBIT(4, 2, 0);
# Result: 0
# ustawia bit 40 zmiennej 64-bitowej i odczytuje go z powrotem
uint64 alarms := 0;
alarms := SETBIT(alarms, 40, 1);
GETBIT(alarms, 40);
# Result: 1 (a 64-bit variable has bits 0 to 63)
```

## SETBITS

`SETBITS` zwraca liczbę, w której pole bitowe o długości `numberOfBits` bitów od `startBit` zostało zastąpione przez `value`.

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

**Przykład**

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

**Błędy** — *Given number of bits (2) is not enought for storing the value 4.*, gdy `value` nie mieści się w polu (komunikat ma właśnie taką pisownię).

## GETBYTE

`GETBYTE` zwraca jeden bajt liczby (0 – 255) jako `uint`.

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

**Przykład**

```taphome
# indeks 0 to najniższy bajt, indeks 1 następny
GETBYTE(256, 0);
# Result: 0
GETBYTE(256, 1);
# Result: 1
# 259 to 0x0103, więc bajt 0 ma wartość 3
GETBYTE(259, 0);
# Result: 3
```

## SETBYTE

`SETBYTE` zwraca liczbę, w której bajt na pozycji `index` został zastąpiony przez `value` (0 – 255).

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

**Przykład**

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

**Błędy** — *Given value (X) is bigger than maximum byte value.*; *Given value is less than 0.*

## TOBCD

`TOBCD` konwertuje liczbę całkowitą na spakowany kod BCD — każda cyfra dziesiętna w osobnych 4 bitach — i zwraca ją jako `uint`; zachowywanych jest do 8 cyfr.

```text
TOBCD(number)
```

**Przykład**

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

## FROMBCD

`FROMBCD` konwertuje spakowaną wartość BCD z powrotem na zwykłą liczbę.

```text
FROMBCD(number)
```

**Przykład**

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

**Błędy** — *FROMBCD - number 26 is not in BCD format* oraz pozycja cyfry, gdy grupa 4 bitów jest większa niż 9 (tutaj `0x1A`).

## Operatory bitowe i odpowiedniki w Excelu

Operatory działają na liczbach całkowitych; operand `double` jest najpierw konwertowany na `int64`, a operand `Null` daje `Null`. Pełna lista i priorytety są na stronie [Operatory](https://taphome.com/pl/docs/script/operators/).

| Operator | Przykład | Wynik | Excel |
|---|---|---|---|
| `<<` przesunięcie bitowe w lewo | `8 << 2` | `32` | `BITLSHIFT(number, shift_amount)` |
| `>>` przesunięcie bitowe w prawo | `32 >> 2` | `8` | `BITRSHIFT(number, shift_amount)` |
| `&` bitowe AND | `3 & 1` | `1` | `BITAND(number1, number2)` |
| `\|` bitowe OR | `2 \| 1` | `3` | `BITOR(number1, number2)` |
| `^` bitowe XOR | `5 ^ 1` | `4` | `BITXOR(number1, number2)` |

> [!WARNING]
> Operatory bitowe wiążą słabiej niż porównania: `a & 1 > 0` oznacza `a & (1 > 0)`. Zawsze używaj nawiasów.

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

Zobacz przykład operacji bitowych w [Arkuszach Google](https://docs.google.com/spreadsheets/d/1hF5FMpGMJbgYh-YLwWrq2n186_ATyGyLUb689__IhLY/edit?usp=sharing) albo wypróbuj interaktywne narzędzie [bitwisecmd.com](http://bitwisecmd.com/).
