Один байт от 0 до 255, который нужно масштабировать от 0 до 7

Один 1 байт может быть от 0 до 255. Я собираюсь изменить масштаб с 0 на 7. Я сделал это:

bit8 := uint8(136)

// To re-scale 1 byte from 0 to 2^3-1 i.e. 0 to 7
bit3 := bit8 / 0xff * 0b0111

В результате bit3 будет 0, но я ожидаю, что это будет 3 или 4 в зависимости от округления в меньшую или большую сторону. Поскольку точное значение с плавающей запятой будет 136/255*7 = 3.733333333.

Как я могу достичь желаемого результата? На данном этапе округление в большую или меньшую сторону не имеет значения. Что удобно, то и хорошо.

Примечание

Я хочу, чтобы операция была максимально эффективной. Потому что это будет сделано внутри цикла. Таким образом, решения, подобные приведенным ниже, не являются оптимальными:

bit8 := uint8(136)

// To re-scale 1 byte from 0 to 2^3-1 i.e. 0 to 7
bit3 := uint8(float64(bit8) / 255.0 * 7.0)
bit3 := bit8 & 7?
Bohemian 14.08.2024 13:00

Разве это не то, что вы описываете в подписи log2()?

500 - Internal Server Error 14.08.2024 13:01

Ваша первая попытка равна нулю, потому что вы выполняете целочисленное деление, а x/255 всегда будет равно нулю. Сначала вы можете умножить на 7, но тогда вам понадобится больший тип int.

matt 14.08.2024 13:05

«Я ожидаю, что это будет 3 или 4, в зависимости от округления в меньшую или большую сторону». Целочисленное деление не выполняет «округление» некоторых промежуточных значений с плавающей запятой, таких как 3,73333.

Volker 14.08.2024 13:07

@matt Какой самый быстрый способ сделать это?

Megidd 14.08.2024 13:09
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
3
5
60
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Возьмите верхние 3 бита байта (округляя вниз):

bit3 := bit8 >> 5

На всякий случай, как я могу изменить его, чтобы округлить?

Megidd 14.08.2024 13:15

Другой способ взглянуть на это: ваше масштабирование 256 до 8, то есть x*8/256, сокращается до x/2^5 или x>>5.

matt 14.08.2024 13:40

@matt Это было потрясающее объяснение. Поразительнй.

Megidd 14.08.2024 14:17

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