Odpowiednia operacja bitowa na zmiennej typu integer

0

Witam, sprawa wygląda tak, że operuję w programie na zmiennych typu int.
Jak wiadomo kodowane są w procesorze za pomocą systemu binarnego ciągu 1010111010101...itd

Piszę program, w którym nie ma znaczenia faktyczna wartość zmiennej, lecz ciąg tych zer i jedynek coś mi koduje, tzn :
Mam tablicę zmiennych o wartościach od 1 do 16 = 2^4

Wartość jednej z nich binarnie to 0111 ( 7 ), teraz mam w programie zmienną bit, której wartość oznacza na które miejsce w zapisie binarnym licząc od prawej, należy wpisać 0 zamiast 1. Np dla tego przykładu gdy bit=1 , to znaczy ze z 0111 chce uzyskac 0110. Pytanie jak to zrobić w kodzie c++ ? Żaden z operatorów bitowych mi tego nie da, i to ma działać dla wszystkich przypadków, bo program działa w jednej wielkiem pętli, np dla 010111111 dla bit= 5 ma dać w efekcie 010101111. Help

3

Wtf, jak to nie da żaden z operatorów?

Tak się zeruje bit:

jakas_liczba & ~(1 << numer_bitu);

Bity numerujemy od zera.
numer_bitu = 0
jakas_liczba = 0111b
(1 << numer_bitu) = 1 << 0 = 0001b
~(1 << numer_bitu)= ~0001b = 1110b
jakas_liczba & ~(1 << numer_bitu) = 0111b & 1110b = 0110b

Tadam.

Do takich operacji zazwyczaj używa się liczb bez znaku oraz o znanych długościach, np. std::uint32_t. Można też używać std::bitset w zależności od potrzeb.

0

Wielkie dzięki , sprytne.
Jest jeszcze jedna kwestia, które mnie nurtuje.
Gdy mam zapisaną liczbę np. 3 ( 0011b) ...
Chcę odzyskiwać z liczby int na których miejscach w zapisie od prawej są jedynki reprezentujące ją binarnie.
Tzn dla tej 3 (0011b) to pozycja 1 i 2 ( od prawej)
dla 5 ( 0101b) to poz 1 i 3

0

Można to napisać np. tak:

#include <stdio.h>

int main(void) {
	int number = 5;
	int pozycja = 0;
	
	while (number > 0)
	{
		if ((number & 1) == 1)
		printf( "jedynka na pozycji:  %d\n", pozycja+1 );
		number >>= 1; // przesuniecie bitowe o 1 w prawo
		++pozycja;
	}
	
	return 0;
}

http://ideone.com/f56jcm

1 użytkowników online, w tym zalogowanych: 0, gości: 1