Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Operacje na bitach w C


Rekomendowane odpowiedzi

Opublikowano

Mam za zadanie:

Napisz funkcje usigned short ZamienPrzedzial(unsigned short liczba, int start, int koniec), która zamienia wszystkie bity argumentu liczba z 0 na 1 oraz 1 na 0, w przedziale start-koniec, gdzie start oznacza mniej znaczący bit a koniec bardziej znaczący bit.

 

Sama zamiana to banał, napisanie liczby bitowo też(różne operacje bitowe składają sie na cały program), ale nie mam pomysłu jak zanegować bity w określonym przedziale, mógłby ktoś podpowiedzieć, ew. podrzucić kod jak wy to widzicie?

Opublikowano

Myślę, że dobrym pomysłem byłoby: Wziąć ten przedział bitowy do jakiejś innej zmiennej przez zaendowanie przedziału:

N N N W W W N N N

0 0 0 1 1 1 0 0 0 &
-----------------
0 0 0 W W W 0 0 0

Zanegować go (~)

w pierwotnej zmiennej ustawić przedział na 1 przez zorowanie:
 

N N N W W W N N N

0 0 0 1 1 1 0 0 0 |
-----------------
N N N 1 1 1 N N N

I zendować przez zanegowany przedział:
 

1 1 1 Z Z Z 1 1 1 

N N N 1 1 1 N N N &
-----------------
N N N Z Z Z N N N

 

Prawdopodobnie jest lepsza metoda na zrobienie tego, ale taka mi przyszła do głowy.


Pomagam w projektach dotyczących programowania (C++/C/Java/C#/inne). Jak masz jakiś problem, napisz do mnie, wspólnie poszukamy rozwiązania ;).

Opublikowano

Mam taki pomysł:

Stowrzyc maske=0

jesli podam przedział załóżmy od 3-5 to 

maska*=pow(2,i) i to w pętli for gdzie i=start

później xor liczba^maska i w ten sposób będę miał zanegowane bity w określonym przedziale.

Będzie to działać?

Opublikowano

Najlepiej to sobie bitowo rozpisać jak chcesz to wykorzystać, najlepiej wziąć długopis i kartkę i rospisać bit po bicie na podobnej zasadzie, jak ja zaprezentowałem to wyżej. 

Nie ma sensu używać potęgowania przez dwa skoro masz w języku C operator przesunięcia bitowego <<. Jeśli miałoby być to w pętli to myślę, że takie coś mogłoby być:
 

for(i = start; i <= koniec; i++) maska &= 1<<i;

Chociaż, jak się pomyśli, to się znajdzie optymalniejsze rozwiązanie, jak zrobienie maski na odpowiednią długość a potem przesunięcie tak, by pokrywała się z założonym początkiem i końcem.

Dopasuj w zależności jak indeksujesz bity.

I faktycznie - xor jest lepszym rozwiązaniem.

EDIT: Znalazłem chyba lepsze rozwiązanie na stworzenie maski:

początek = 3 (indeksacja od 0)
koniec = 5

długość = koniec - początek = 5 - 3 = 2

maska =   1 << długość + 1
0 0 0 0 0 1 0 0 0 
maska -= 1
0 0 0 0 0 0 1 1 1 maska  << początek
0 0 0 1 1 1 0 0 0

 


Pomagam w projektach dotyczących programowania (C++/C/Java/C#/inne). Jak masz jakiś problem, napisz do mnie, wspólnie poszukamy rozwiązania ;).

Opublikowano
us zamienprzedzial(us liczba, int start, int koniec) {
	int i;
	us maska, wynik;
	maska = 0;
	for (i = start; i <= koniec; i++) {
		maska += pow(2, i);
	}
	wynik = liczba^maska;
	return wynik;

}

Zrobione tak.Działa.Ale nie wiem czy prawidłowo.

Co o tym myślisz?

Opublikowano

Mogłeś użyć tej metody, którą pokazałem ci wyżej, zamiast potęgi, unikniesz zbędnej pętli.


Pomagam w projektach dotyczących programowania (C++/C/Java/C#/inne). Jak masz jakiś problem, napisz do mnie, wspólnie poszukamy rozwiązania ;).

Opublikowano

Jestem mocno początkujący, wydaje mi się troche nie intuicyjna, ciężka do zrozumienia(chyba wiesz o co mi chodzi) xD.

Ale na pewno skorzystam i z niej.

Dziękuje :D

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...