cpp

Побитовые операторы

Побитовые операторы предназначены для манипуляции отдельными битами. Язык Go поддерживает следующие побитовые операторы:

  • & — двоичное И:
var x, y, z uint8 = 100, 75, 0
z = x & y
fmt.Printf("%b\n", x) // 1100100
fmt.Printf("%b\n", y) // 1001011
fmt.Printf("%b\n", z) // 1000000
  • | — двоичное ИЛИ:
var x, y, z uint8 = 100, 75, 0
z = x | y
fmt.Printf("%b\n", x) // 1100100
fmt.Printf("%b\n", y) // 1001011
fmt.Printf("%b\n", z) // 1101111
  • ^ — двоичное исключающее ИЛИ:
var x, y, z uint8 = 100, 250, 0
z = x ^ y
fmt.Printf("%b\n", x) //  1100100
fmt.Printf("%b\n", y) // 11111010
fmt.Printf("%b\n", z) // 10011110
  • &^ — двоичное И НЕ:
var x, y, z uint8 = 100, 75, 0
z = x &^ y
fmt.Printf("%b\n", x) // 1100100
fmt.Printf("%b\n", y) // 1001011
fmt.Printf("%b\n", z) //  100100
  • << — сдвиг влево — сдвигает двоичное представление числа влево на один или более разрядов и заполняет разряды справа нулями:
var x uint8 = 100
fmt.Printf("%b\n", x) //  1100100
x = x << 1
fmt.Printf("%b\n", x) // 11001000
x = x << 1
fmt.Printf("%b\n", x) // 10010000
x = x << 2
fmt.Printf("%b\n", x) //  1000000
  • >> — сдвиг вправо — сдвигает двоичное представление числа вправо на один или более разрядов и заполняет разряды слева нулями, если число положительное:
var x uint8 = 100
fmt.Printf("%b\n", x) // 1100100
x = x >> 1
fmt.Printf("%b\n", x) //  110010
x = x >> 1
fmt.Printf("%b\n", x) //   11001
x = x >> 2
fmt.Printf("%b\n", x) //     110

Наиболее часто двоичное представление числа используется для хранения различных флагов (0 — флаг сброшен, 1 — флаг установлен). Примеры установки, снятия и проверки установки флага приведены в листинге 3.1.

Листинг 3.1. Работа с флагами

package main

import "fmt"

func main() {
   const (
      FLAG1 uint8 = 1 << iota
      FLAG2
      FLAG3
      FLAG4
      FLAG5
      FLAG6
      FLAG7
      FLAG8
   )
   var x uint8 = 0       // Все флаги сброшены
   fmt.Printf("%b\n", x) //        0
   var y uint8 = 0xFF    // Все флаги установлены
   fmt.Printf("%b\n", y) // 11111111
   // Устанавливаем флаги FLAG1 и FLAG7
   x = x | FLAG1 | FLAG7
   fmt.Printf("%b\n", x) //  1000001
   // Устанавливаем флаги FLAG4 и FLAG5
   x = x | FLAG4 | FLAG5
   fmt.Printf("%b\n", x) //  1011001
   // Снимаем флаги FLAG4 и FLAG5
   x = x ^ FLAG4 ^ FLAG5
   fmt.Printf("%b\n", x) //  1000001
   // Проверка установки флага FLAG1
   if (x & FLAG1) != 0 {
      fmt.Println("FLAG1 установлен")
   }
   fmt.Printf("%b\n", FLAG1) //        1
   fmt.Printf("%b\n", FLAG2) //       10
   fmt.Printf("%b\n", FLAG3) //      100
   fmt.Printf("%b\n", FLAG4) //     1000
   fmt.Printf("%b\n", FLAG5) //    10000
   fmt.Printf("%b\n", FLAG6) //   100000
   fmt.Printf("%b\n", FLAG7) //  1000000
   fmt.Printf("%b\n", FLAG8) // 10000000
}

Учебник Go (Golang)
Учебник Go (Golang) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов

cpp