Что означает 0x1 на Голанге? - PullRequest
0 голосов
/ 06 ноября 2018

Я пытаюсь понять этот фрагмент кода, который возвращает количество нулей, к которому добавляется префикс байтового массива, но я не уверен, что такое 0x1. Поиск в Google не помогает, но я предполагаю, что 0x1 возвращает первый бит? Как они называются?

Кроме того, я знаю, что это отдельный вопрос, но я не думаю, что он требует нового потока: я не совсем понимаю, почему мы вкладываем здесь цикл, сдвигаем бит и вычитаем j из 7. Это как байт преобразован в двоичный файл?

IdLength := 32
func PrefixLen(count [IdLength]byte) int {
    for i := 0; i < IdLength; i++ {
        for j := 0; j < 8; j++ {
            if (count[i]>>uint8(7-j))&0x1 != 0 {
                return i*8 + j
            }
        }
    }
    return IdLength*8 - 1
}

1 Ответ

0 голосов
/ 06 ноября 2018

0x1 - это шестнадцатеричное обозначение числа 1. Вы & некоторое целое число с 0x1, чтобы получить его младший (самый правый) бит. Вы пишете 0x1 вместо 1 при использовании битовой маски, потому что конвертировать из базы 16 проще, чем из базы 10 в базу 2.

Что касается второго вопроса, то, что func PrefixLen делает, находит число последовательных нулей в начале count. Внешний цикл делает один байт каждый раз, а внутренний цикл обрабатывает отдельные биты: когда j = 0, он сдвигается на 7 вправо, получая первый бит слева, когда j = 1, он сдвигается на 6, получая второй бит, и так на. При обнаружении бита 1 возвращается количество проверенных битов.

...