# Логические и побитовые операторы

В Verilog выделяют логические (`&&`, `||`, `!`) и побитовые (`&`, `|`, `~`, `^`) операторы.

Результатом логического И (`&&`) является 0 (*false*), когда хотя бы один его операнд 0; 1 (*true*), когда оба операнда 1; иначе X. Аналогично для логического ИЛИ (`||`). Оператор логического отрицания (`!`) преобразует истинный операнд в 0, а ложный операнд в 1, иначе X.

Побитовые операторы объединяют биты в одном операнде с соответствующим битом в другом операнде для вычисления побитового результата. Унарные побитовые операторы объединяют биты единственного операнда между собой и возвращается однобитовое значение.

*Пример*

{% code overflow="wrap" lineNumbers="true" %}

```verilog
// <тип данных> <переменная> <оператор> <выражение>
module logical_operators_tb;
  reg [7:0] a, b;
  initial begin
    a = 8'd4; b = 8'd5;
    $display("a_bin = %b, b_bin = %b ", a, b);
    $display("~a    = %b", ~a);  // побитовое логическое НЕ (унарный оператор)
    $display("a & b = %b", a & b); // побитовое логическое И (бинарный)
    $display("a | b = %b", a | b); // побитовое логическое ИЛИ (бинарный)
    $display("a ^ b = %b", a ^ b); // побитовое логическое Искл. ИЛИ (бинарный)

    $display("&a = %b", &a);   // горизонтальное логическое И (унарный)
    $display("|a = %b", |a);   // горизонтальное логическое ИЛИ (унарный)
    $display("^a = %b", ^a);   // горизонтальное логическое Искл. ИЛИ (унарный)
    $display("^~a = %b", ^~a);

    $display("1 && 0 = %b", 1 && 0); // логическое И (бинарный)
    $display("1 || 0 = %b", 1 || 0); // логическое ИЛИ (бинарный)
    $display("!1 = %b", !1);         // логическое НЕ (унарный)
  end
endmodule
```

{% endcode %}

*Результат исполнения*

{% code overflow="wrap" lineNumbers="true" %}

```log
a_bin = 00000100, b_bin = 00000101 
~a    = 11111011
a & b = 00000100
a | b = 00000101
a ^ b = 00000001
&a = 0
|a = 1
^a = 1
^~a = 0
1 && 0 = 0
1 || 0 = 1
!1 = 0
```

{% endcode %}
