LINUX.ORG.RU

Заменить бит в слове

 


0

1

Есть 32-хразрядное слово.

c = 0x11111111;
s = c >> 1;
s0 = c & 1;

Надо заменить 29-й бит на (30-й ^ s0)

Можно сделать с std::bitset, теперь хотелось бы просто сдвигами и &,|,^.

Заранее благодарен.

★★

Надо заменить 29-й бит на (30-й ^ s0)

Сначала очищаешь бит с помощью логического И, потом ставишь нужное значение с помощью логического ИЛИ. Сдвигами и отрицаниями делаешь нужные маски.

Заранее благодарен.

Не используй это выражение.

i-rinat ★★★★★
()
bool GetBit(uint32_t n,int bit)
{
  return (n>>bit)&0x01;
}
void SetBit(uint32_t& n, int bit, bool value)
{
  if(value)
    n|=(1<<bit);
  else
    n&=~(1<<bit);
}

c = 0xABCE;
s0 = 0xFEFA;
SetBit(c,29,GetBit(c^s0,30));
pathfinder ★★★★
()
Последнее исправление: pathfinder (всего исправлений: 1)
Ответ на: комментарий от i-rinat

Блин, рука дрогнула. ТС разберётся.

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

Почему?

Писать «Заранее спасибо» в письме с просьбой может быть воспринято вашим адресатом как оскорбление. Точнее говоря, человек может посчитать, что ему:

  1. или приказывают что-то сделать. Иными словами, человек еще не дал согласие что-то делать, его уже благодарят, вынуждая в свою очередь соответствовать этой благодарности. Просящий уверен, что его просьба будет выполнена и ему не важно, хочет исполнитель этого или нет.
  2. или после сделанного его не собираются благодарить (ведь заранее уже сказали спасибо).
i-rinat ★★★★★
()
Ответ на: комментарий от anonymous

Возможно, так действительно, было бы корректнее.

Нам, в Мухосрансках, не все тонкости этикета могут быть известны.

:-P

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

Спасибо!

Тогда так должно работать:

uint32_t bit_value = ((c >> 1) ^ (c >> 30)) & 1;
c &= ~(UINT32_C(1) << 29);
c |= bit_value << 29;
braboar ★★
() автор топика
Ответ на: комментарий от i-rinat

И тебе, добрый человек, спасибо!

Сначала очищаешь бит с помощью логического И, потом ставишь нужное значение с помощью логического ИЛИ. Сдвигами и отрицаниями делаешь нужные маски.

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

Владимир

Можно так /ниже условный пример/.


typedef struct  FlBit__ {

 USHORT   Fl01        : 2;
 USHORT   Fl02        : 2;
 USHORT   Fl03        : 1;
 USHORT   Fl04        : 1;
 USHORT   Reserved    :10;

} FlBit_;
[\code]
anonymous
()
Ответ на: комментарий от anonymous

Владимир

Добавочка.
У меня в проектах именно в таком стиле оформлены поля, содержащие флаги.

PS: «И хрустит и очень вкусно».

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

У меня в проектах именно в таком стиле оформлены поля, содержащие флаги.

А если нужна замена битов в массиве чисел?

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

Владимир

Используйте ссылку на элемент массива и тип FlBit_.

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

Чукча не читатель?

хотелось бы просто сдвигами и &,|,^

braboar ★★
() автор топика
Ответ на: комментарий от i-rinat

Вообще он читор конечно: соревноваться в таком деле одним аккаунтом(да даже парочкой реинкарнированных) с коллективным хайвмайндом - это заранее фэйл

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

Никто ничего не переформатировал. Писал сам с нуля не читая чужих вариантов. В удалённых осталось предыдущее сообщение, где я допустил ошибку в коде.

saahriktu ★★★★★
()
Ответ на: комментарий от saahriktu
bool bit = (s0 ^ ((c >> 30) & 1)) & 1;
s &= ~(1 << 29);
s |= bit << 29;

Вот результат, основанный на ответе Esper. Достаточно читаем?

И, ваш код содержит ветвления, которые сильно будут тормозить. У меня достаточно большие объемы данных.

В любом случае, спасибо.

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

s |= bit << 29;

Всё-таки это весьма подозрительная конструкция. Допустим, соответствующий бит в s равен 1, а bit равен 0. Что будет? Правильно, 1 | 0 == 1. Соответствующий бит не сбросится в 0.

Я даже на бумажке выписывал всю эту таблицу:

a b
0 0 | 0
0 1 | 1
1 0 | 0
1 1 | 1
Тут элементарными логическими функциями не отделаться. В том смысле, что это просто b.

Поэтому я и ввёл конструкцию c if'ами.

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

Соответствующий бит не сбросится в 0.

А он и не должен там сброситься. Его сбрасывает

s &= ~(1 << 29)

И нафиг ветвления там, где все решается без них.

А ведь пять звезд.

Полагаю, такая конструкция вообще порвет шаблон?

int a = 10, b = 20;
a^=b; b^=a; a^=b;
printf("a = %i, b = %i\n", a, b);
a = 20, b = 10
anonymous
()
Ответ на: комментарий от anonymous

Полагаю, такая конструкция вообще порвет шаблон?

вроде 21 век на дворе и память и регистры завезли.

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

Полагаю, такая конструкция вообще порвет шаблон?

Отнюдь. И вариантов всегда много. Есть, например, и такой вариант:

        int a = 10, b = 20;
        a-=b; b+=a; a-=b; a*=-1;
        printf("a = %d, b = %d\n", a, b);

Его сбрасывает

Тут в сабжевой задаче есть такой момент, что ещё заранее неизвестно нужно ли вообще менять состояние этого бита. При этом его может понадобиться не только сбрасывать, но и, наоборот, выставлять в 1. 0 & 0 == 0.

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

Память медленная, а кэша может оказаться мало.

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

Код можно, да, немного сократить:

s0 = c & 1;
s30 = (c >> 30) & 1;
s29 = (c >> 29) & 1;
x = s30 ^ s0;
if (s29 != x) c ^= (1 << 29);

saahriktu ★★★★★
()
7 января 2020 г.
Ответ на: комментарий от saahriktu

симметричней(и короче по присвоениям но длиннее по тексту: [code=c] a=-(a+b);b=-(a+b);a=-(a+b) [/code]

т.е будь(ха ха) полный(в этом! смысле аналог) симметричной разности (ака хоr)

[code=c] a@=b;b@=a;a@=b; [/code]

где a@b == -(a+b)

т.е тут @ есть минусСумма

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

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

Какой пример, такой и пример на этот пример.

saahriktu ★★★★★
()
Ответ на: комментарий от i-rinat

Писать «Заранее спасибо» в письме с просьбой может быть воспринято вашим адресатом как оскорбление.

А еще не забывайте помянуть в позитивном ключе угнетенные меньшинства. Отсутствие таких упоминаний может быть воспринято как унижение и попрание их права быть упомянутыми в контексте обсуждения.

Также рекомендуется вставить несколько фраз, выражающих категорическую поддержку движений за экологию, климат и права животных.

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

Короче - не зафакапь челендж и будешь трендсеттером.

olelookoe ★★★
()
Последнее исправление: olelookoe (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.