LINUX.ORG.RU

Как удобно занулять отдельные биты?

 ,


0

2

Спасибо всем, кто ответил по существу. Остальных, по видимому, самое время отправить в игнор. Такие треды вообще хорошие детекторы.

★★★★★

Последнее исправление: meliafaro (всего исправлений: 4)

bite

занулять отдельные байты?

только четыре младших бита, остальное занулить

не знает, как сбросить или установить биты

На rust-е пиши, куда тебе.

cloun1902
()
Ответ на: комментарий от moonmadness

Иногда прочитаешь вопрос, и думаешь, или речь о чем-то новом и сложном, о чем даже не слышал… или дети пробрались к папке в рабочий кабинет… :)

Oleg_Iu
()
Ответ на: комментарий от EXL

Ну да, всё верно. Как говорится, бесконечно можно смотреть на три вещи. Одна из них - как раст-кодеры пытаются понять, каким образом работает железо/система/сишные либы.

cloun1902
()
Ответ на: комментарий от meliafaro

Тогда крейт скачай, который реализует «удобно занулять отдельные байты». Это же удобно должно быть, карго, crates.io, все дела - пара строк и готово.

cloun1902
()

Ну и где аноним, который знает в какую сауну отправлять альтернативно умственно одаренных?

anonymous
()
Ответ на: комментарий от meliafaro

Я и пишу на Расте.

Тогда огорчу в этом вопросе он ничем от C++ не отличается.

anonymous
()

Чувак, хочу тебе порекомендовать Род Хаггарти «Дискретная математика для программистов». Конечно там меньше нужного минимума если хоть что-то более-менее сложное делать, но она судя по беглому просмотру, даже школьникам и детсадовцам зайдёти даст хоть какую-то базу. А дальше можно начинать серьёзные книжки читать.

Просто такие вопросы, вот такую реакцию вызывают.

peregrine ★★★★★
()
Последнее исправление: peregrine (всего исправлений: 2)
Ответ на: комментарий от meliafaro

не обижайся, но оно и видно

x &= 0b1111;
anonymous
()

a |= 0xff – выставить младшие 8 бит в 1
a &= 0xff – оставить только младшие 8 бит
a |= (0xff << (1*8)) – по аналогии для битов [8; 15]
a &= (0xff << (1*8)) – по аналогии для битой [8; 15]

В комбинации с инверсией позволяет творить что угодно в битовом поле. А всякая фигня типа set_bit_1 (a) – для кретинов a’k’a «я не хочу врубаться во что-то настолько простое».

На заметку

0x00 - 0000 0000

0x01 - 0000 0001
0x02 - 0000 0010
0x04 - 0000 0100
0x08 - 0000 1000

0x10 - 0001 0000
0x20 - 0010 0000
0x40 - 0100 0000
0x80 - 1000 0000

0xff - 1111 1111

Инверсия (зависит от размера)

~0x00 --> 0xff
~0xff --> 0x00

Вообще <<, >>, |, &, ~ да и всё наверное, что нужно знать.

В случае особой одарённости есть en wiki на это счёт, там всё в примерах довольно подробно. Да и русскоязычных источников, уверен, валом.

Ну ещё знаковые типы спереди заполняются знаковым битом при сдвиге вправо.

В примерах на Go https://play.golang.org/p/BvZ2IUPFRD8

Гошный оператор &^ можно заменить на & (~(value)) вроде бы.

kostyarin_ ★★
()
Последнее исправление: kostyarin_ (всего исправлений: 5)

Вообще, толковые парни всегда работают с масками

#define MASK ((0xff < 16) | (0xff < 8) | (0xff < 0))

// [...]
     value = value & MASK // очистить лишнее
     value = value & (~MASK) // оставить только лишнее

А какая маска – уже зависит от чего там нужно. Подход универсальный. Понятный. И так далее. Кто будет читать код поймёт, что там к чему и не затупит.

kostyarin_ ★★
()
Ответ на: комментарий от kostyarin_

для кретинов a’k’a «я не хочу врубаться во что-то настолько простое».

Или для тех, кто врубился много лет назад, но все равно предпочитает чтобы в коде были человекочитаемые методы вместо операторов (которые в разных языках еще и разные).

vlad9486
()
Ответ на: комментарий от XoFfiCEr

он не видит разницы. у всех писателей на расте, хлебушек вместо мозгов

anonymous
()
Ответ на: комментарий от XoFfiCEr

тебе ли веб макаке писать? ты до сих пор код таймера не показал, клоун.

а твой сайт это вообще божественно… челик который бутстрап не осилил.

anonymous
()
Ответ на: комментарий от vlad9486

Или для тех, кто врубился много лет назад, но все равно предпочитает чтобы в коде были человекочитаемые методы вместо операторов (которые в разных языках еще и разные).

Стиль программирования никто не отменял. Если у Вас одно вхождение – почему бы и не сделать его на операторах. Если оно слишком сложное – почему бы и не расписать его на несколько строк, констант и прокомментировать.

Читаемость кода не в битах, которые типа видны. На самом деле вот такая вот штука

val = 0b0000100

вообще не читаема по сравнению с

val = (1 << 2)

Т.к. считать нули и единицы при этом нет никакой необходимости.

Ну и разумеется, если вхождений много – почему бы не завернуть их в функцию или макрос – нет проблем. Просто в Си есть битовые поля или как их там. И, честно говоря, тема больше вызывает вопросов.

Обычно речь идёт о какой-то маске. Или о каком-то бите (флагах). Ну или преобразовании числа в набор байтов для пересылке по сети.

Кто работает с float point в своём представлении, то это вопрос отдельный. Т.к. я с таким не сталкивался. Где-то читал, что для тестирования (+0 там или -0) используется 16-ричное представление. Я в общем не в курсе.

Набор флагов это вообще дело обычное (должно преподаваться в детском саду)

#define THE_LIB_ENABLE_ONE    (1 << 0) // 0x01
#define THE_LIB_ENABLE_TWO    (1 << 1) // 0x02
#define THE_LIB_ENABLE_THREE  (1 << 2) // 0x04
#define THE_LIB_ENABLE_FOUR   (1 << 3) // 0x08

// [...]

int
with_flags (int val, int flags) {
     return val | flags;
}

bool
is_flag_set (int val, int flag) {
    return val & flag; // (val & flag) != 0
}

// [...]

    val = with_flags (val, THE_LIB_ENABLE_TWO |  THE_LIB_ENABLE_FOUR);

// [...]

    if (is_flag_set (val, THE_LIB_ENABLE_TWO |  THE_LIB_ENABLE_FOUR)) {
        // stuff
    }

Необходимость использовать такое дерьмо 0b0000100 говорит о том, что программист нафиг слал бизнес-логику. Что и есть основа говнокода.

kostyarin_ ★★
()
Последнее исправление: kostyarin_ (всего исправлений: 1)
Ответ на: комментарий от anonymous

вот не ты ли меня хвалил месяца 3 назад за хороший дизайн? Я никак правда не отреагировал почуяв подвох.

XoFfiCEr ★★☆☆
()
Ответ на: комментарий от XoFfiCEr

Да, оговорился. Я вчера был почти 1.5 суток без сна и с лёгким похмельем, соображалка работала туго, тем более, со всяким матаном.

meliafaro ★★★★★
() автор топика

Кстати, можно заметить, что недоязычек опять сливает. Даже в таком, по словам местных, говне как C++ из коробки есть простой способ «удобно занулять отдельные биты»:

std::bitset<CHAR_BIT>{127}.reset(3)
cloun1902
()
Ответ на: комментарий от cloun1902

Я сделал вот так и мне вообще пофиг:

let mes_type = message[0] & 0xF0; 
let channel = (message[0] & 0xF) + 1;
В std Раста, кстати, тоже что-то есть на тему битсетов, но лень было разбираться ради двух строчек.

meliafaro ★★★★★
() автор топика
Ответ на: комментарий от cloun1902

по словам местных, говне как C++

Просто никто не уточняет, что другие языки от этого не становятся лучше C++.

anonymous
()
Ответ на: комментарий от Eddy_Em

Велкам ту бак блудный сын ))))))))))

anonymous
()
Ответ на: комментарий от kostyarin_

А всякая фигня типа set_bit_1 (a) – для кретинов

С чего вдруг для кретинов? У меня одна утилита для x86/arm/avr/powerpc/etc big/little-endian 8/32/64 битных хранит и обрабатывает конфигурацию есть кучка битовых полей, на разных железках требования разные, на 64битных x86, 64 поля для всего и вся, на avr требования малые и 8 бит хватает обычных (хотя можно и больше). А код для всех один и тот же. И в процессе использования я выставляю биты где аналог set_bit_1(a) является макросом тело которого определяется платформой, есть также ещё 4 функции скрывающие работу с битами. Так что если есть единственное место с точными типами вроде uint16_t то да, явно наместе задать и делов то, а если есть иное в рамках не меняю как хочу, а в соотвецтвии с форматом то не использовать аналог set_bit_1(a) это и есть кретинизм.

anonymous
()
Ответ на: комментарий от meliafaro

но лень было разбираться ради двух строчек.

Лол.

anonymous
()
Ответ на: комментарий от meliafaro

Я и пишу на Расте.

так толсто, что даже толсто

anonymous
()
Ответ на: комментарий от meliafaro

А если я вместо

let mes_type = message[0] & 0xF0;

напишу

let mes_type = message[0] & 0xE0;

раст ведь мне компайл тайм ошибку выдаст? Или это надо в unsafe секцию пихать?

anonymous
()
Ответ на: комментарий от anonymous

И в процессе использования я выставляю биты где аналог set_bit_1(a) является макросом

У тебя там нормальное название скорее всего. А если set_bit_1 – то это обоснованный кретинизм. Т.е. его высшая форма – осознанная и оправданная – «я делаю говно, но у меня есть веские причины!»

kostyarin_ ★★
()
Ответ на: комментарий от kostyarin_

Аааа, я понял тебя, ты про буквальный смысл. Ну так то да.

anonymous
()
Ответ на: комментарий от anonymous

Здесь просто будет логическая ошибка. Ничего не слетит, но данные будут выводиться с ошибками. В других случаях зависит от того, что ты будешь с этими чиселками делать) Если, например, это впоследствии в выходу за границы массива, Раст не скомпилит.

meliafaro ★★★★★
() автор топика
Последнее исправление: meliafaro (всего исправлений: 1)
Ответ на: комментарий от Eddy_Em

Не забывай оповещать нас, желательно, прямо здесь.

meliafaro ★★★★★
() автор топика

Пиздец.

anonymous
()

Избранные тэги: gnome,rust,slackware

А слакварь то за что? Не мимикрируй, положь на место. :)

anonymous
()
Ответ на: комментарий от meliafaro

она

как бы тебя в 2021 спрашивать не перестали с таким вольным подходом к гендерным местоимениям

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.