Golang - преобразовать [8] bool в byte

Я пытаюсь преобразовать логический массив длиной 8 в байт. Кто-нибудь знает, как?

mei := [8]bool{true, true, true, true, false, false, false, false}
myvar := ConvertToByte(mei)

Насколько я знаю, в Go нет простого способа сделать это. Поэтому вам нужно написать свою собственную реализацию. Вот несколько вопросов об одном и том же в Java и C#, которые могут помочь вам начать работу.

phonaputer 14.09.2022 01:55

Каково предполагаемое значение myvar в вашем примере?

Hymns For Disco 14.09.2022 02:01

@HymnsForDisco Изменена стойка ворот, извините за это!

BAR 14.09.2022 02:25
byte — это просто псевдоним для uint8; они одного типа.
Hymns For Disco 14.09.2022 02:30
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
2
4
109
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Перебирайте биты, меняя и устанавливая по ходу дела.

Вот код для случая, когда самый старший бит находится в индексе 0 в массиве:

func ConvertToUint8(mei [8]bool) uint8 {
    var result uint8
    for _, b := range mei {
        result <<= 1
        if b {
            result |= 1
        }
    }
    return result
}


mei := [8]bool{true, true, true, true, false, false, false, false}
myvar := ConvertToUint8(mei)
fmt.Printf("%b\n", myvar) // prints 11110000

Вот код для случая, когда младший значащий бит находится в индексе 0 в массиве:

func ConvertToUint8(mei [8]bool) uint8 {
    var result uint8
    for _, b := range mei {
        result >>= 1
        if b {
            result |= 0b10000000
        }
    }
    return result
}

mei := [8]bool{true, true, true, true, false, false, false, false}
myvar := ConvertToUint8(mei)
fmt.Printf("%08b\n", myvar) // prints 00001111

Для преобразования в uint8 это то же самое, но с заменой byte на uint8?

BAR 14.09.2022 02:32

@BAR byte — это псевдоним для uint8. Используйте любой тип. Я редактирую ответ, чтобы уменьшить путаницу.

malificent 14.09.2022 03:20
func ConvertToByte(bits [8]bool) byte {
    var b byte
    for _, bit := range bits {
        b <<= 1
        if bit {
            b |= 1
        }
    }
    return b
}

Для преобразования в uint8 это то же самое, но с заменой байта на uint8?

BAR 14.09.2022 02:33

@BAR См. мой другой комментарий, но byte и uint8 — это всего лишь два слова для обозначения одного и того же типа в Go. Вы можете заменить любое или все вхождения byte на uint8 или наоборот, и это будет одна и та же программа. Используйте тот, который вы предпочитаете.

Hymns For Disco 14.09.2022 03:04

Чуть-чуть повозился. Перебрать массив:

func boolsToByte( flags [8]bool ) (b byte) {
    mask := byte(0x80)
    for _, f := range flags {
        if f {
            b |= mask
        }
        mask >>= 1
    }
    return b
}

Другие вопросы по теме