Работа с битами переменной

alex0
Offline
Зарегистрирован: 14.12.2015

Помогите пожалуйста. Необходимо из одной переменной, к примеру unsigned int a = 15 (0b0000000000001111) взять к примеру третий бит и поставить его к примеру на место 15 бита переменной b такогоже типа чтобы получилось b= 0b0100000000000000. Полистал маны, но не смог понять как сделать правильно. Возможно мне подойдет bitRead() если он не слишком медленный. работать код будет на stm32f103 и крайне важна большая скорость операций.

MacSim
Offline
Зарегистрирован: 28.11.2012

множте на 0000000000000100+сдвиг влево на 12. помоему так, проверьте.  смотрите битовые операции

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016
int a = 0b0000000000001111;
int b = 0b0100000000000000;

void setup() {
  if (bitRead(a, 3)) bitSet(b, 15);
  else bitClear(b, 15);
}

Ну а быстрее, уже надо переходить на ассемблер.

b =  a & 0b0000000000001000 << 12 | (b & 0b0111111111111111)

Если не ошибся

alex0
Offline
Зарегистрирован: 14.12.2015

Вот на мэйле подсказали, b |= (a & (1 << 3)) << 11;

Только не могу понять что за единица в скобках

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

ТС следовало бы определиться, какой именно бит двигать (написано 15-й, а в образце фигурирует 14-й), а также что делать с остальными битами.

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

2qwone: Отнюдь. То, что быстре, записано в посте №3.

2alex0: Ну Вы же один бит собрались двигать. И, судя по коду, двигаете его на место 14-го, а не 15-го. При этом желаемый результат получится лишь в том случае, если переменная b == 0.

alex0
Offline
Зарегистрирован: 14.12.2015

andriano пишет:

ТС следовало бы определиться, какой именно бит двигать (написано 15-й, а в образце фигурирует 14-й), а также что делать с остальными битами.

 

Третий бит переменной a на место 15 бита переменной b

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

alex0:

1. И в предъявленном образце, и в рекомендованном коде - 14-й.

2. Вы так и не написали, что делать с остальными битами числе b кроме 14-го. В рекомендованном коде они остаются без изменения, а в предложенном Вами образце - обнуляются.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

andriano пишет:

2qwone: Отнюдь. То, что быстре, записано в посте №3.

Там ошибка . Нужный бит в переменной b надо обнулить, а потом наложить.

Как положить слона в холодильник в 3 действия : открыть дверь, положить слона, закрыть дверь.

Как положить бегемота в холодильник в 4 действия :открыть дверь, вытащить слона,положить бегемота ,закрыть дверь.

alex0
Offline
Зарегистрирован: 14.12.2015

andriano пишет:

alex0:

1. И в предъявленном образце, и в рекомендованном коде - 14-й.

2. Вы так и не написали, что делать с остальными битами числе b кроме 14-го. В рекомендованном коде они остаются без изменения, а в предложенном Вами образце - обнуляются.

Никак не могу понять откуда вы берете четырнадцатый.  

В целом должно работать так, переменной A с 10 до 15 встают на места с 7 по 2 в переменной B, потом с переменной C (byte) все её 8 бит занимают места с 15 по 8 в переменной B.

Вообще я хочу понять как выцепить определенный бит и поставить его на нужное место

 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

http://arduino.su/Reference/BitwiseAnd

Побитовое И (&)  и маской очищаем 

Сдвигами >>  <<   двигаем

Побитовое ИЛИ (|)  накладываем

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

alex0 пишет:

В целом должно работать так, переменной A с 10 до 15 встают на места с 7 по 2 в переменной B, потом с переменной C (byte) все её 8 бит занимают места с 15 по 8 в переменной B.

Вообще я хочу понять как выцепить определенный бит и поставить его на нужное место

int a;
int b;
byte c;
b=c<<8 | (a&0xFE00>>8) | (b&0x0001);//если не ошибся

 

alex0
Offline
Зарегистрирован: 14.12.2015

Сейчас еще такая идея родилась. Именно для вытаскивания по битам...

int a = 0b0000000000001000;
int b;
boolean c;
 
void setup() {
  Serial.begin(9600);
  
}
void loop(){
 
  c = a >> 3;
  b = c << 14;
 
  delay(1000);
}
 
Всем огромное спасибо за помощь!!!
Завтра на свежую голову буду всё осмысливать))))