Манипуляция Bit's в Integer

ich
Offline
Зарегистрирован: 10.06.2012

Здрасти всем.

Пытаюсь написать функцию которая изменяет конкретный Bit в Integer, тоесть:

У меня есть переменная uint8_t writeValue = 3; бинерно это writeValue = 00000011; мне нужно изменить конкреный Bit либо на 1 либо на 0, не меняя остальные.

К примеру я хочу изменить 8-Bit на 1, а первый на 0, чтобы у меня получилось writeValue = 10000010 т.е. writeValue =130.

Накорябал какуюто смешную функцию, но она не делает того чего мне надо.

void write(uint8_t pin, bool state){
	uint8_t tempValue = 0; // Переменная в каторую сохраняется изменённое число
	i = outPinsCount; // Колличество Bit's
	do{
		if(pin == (i-1)){ // Если актуальный Bit должен быть изменён
			if(state){ // Бит меняем на 1
				tempValue += pow(2,(i-1));
			}// Иначе меняем на 0
		}else{
			tempValue += (writeValue & (1 << (i-1))); // Сохраняем старые Bit's
		}
		i--;
	}while(i>0);
	this->writeValue = tempValue; // Переписываем старое число на новое.
}

writeValue это переменная каторая отправляется в shiftOut для управления 595-регистром. Я хочу написать функцию для управления пинами по одиночки.

ich
Offline
Зарегистрирован: 10.06.2012

Всё гениальное просто:

if(state){
	(this->writeValue) = (this->writeValue) | (1 << pin);
}else{
	(this->writeValue) = (this->writeValue) & ~(1 << pin);
}

Всем спасибо.

maksim
Offline
Зарегистрирован: 12.02.2012

Можно воспользоваться функцией bitWrite()

maksim
Offline
Зарегистрирован: 12.02.2012

 Или так

if(state){
   writeValue |= (1 << pin);
}else{
   writeValue) &= ~(1 << pin);
}

 

ich
Offline
Зарегистрирован: 10.06.2012

А всётаки, что было в моей логике не так?

ich
Offline
Зарегистрирован: 10.06.2012

2 maksim

Довольно интересная ссылка к  bitWrite() "file///C:/Users/..."

 

maksim
Offline
Зарегистрирован: 12.02.2012

Да, исправил: bitWrite()