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

Jak sprzwdzić czy liczba jest potęgą dwójki?


takanator

Rekomendowane odpowiedzi

Opublikowano

Witajcie. W jaki bardzo szybki sposób mogę spradzić czy podana liczba jest potęgą dwójki i jeżeli nią nie jest to znaleźć najbliższą potęge dwójki tej liczby?

Czytałem że robi to się przesunięciami bitowymi ale nic z tego nie rozumiem i nie wiem w jaki sposób mogę to zaimplementować. Mogę prosić o wytłumaczenie?

watch-dogs-banner.jpg
Opublikowano

#include <stdio.h>
 
int main(int argc, _TCHAR* argv[])
{
 
    unsigned int max = 0x80000000; // najwieksza potega 2 jaka mozna zapisać w uint
    unsigned int liczba = 1024; // twoja liczba
    unsigned int najblizsza = 0; // najblizsza potega twojej liczby
    unsigned int max2 = 0xFFFFFFFF; // do sprawdzanai czy jest blizsza do twojej liczby
    while(max >>= 1){
        unsigned int temp = (liczba > max) ? liczba - max : max - liczba; // sprawdzanie ktora jest wieksza i odejmowanie
        if(max2 > temp){ // jesli jest blizsza potega to:
            max2 = temp; // zmienia max2 na ta blizsza
            najblizsza = max; // tu wiadomo
        }
    }
    printf("%d (%d) %d", najblizsza>>1,  najblizsza, najblizsza<<1); // wyswietlanie
    getchar();
    return 0;
}
To wyjdzie jeśli liczba jest potęgą dwójki.

 

@edit to już działa tak jak chcesz :)

 

@edit, komentarze

Nie pomagam na PW, od tego macie forum!!!

 

#PHP-things

 

 

08FMpDu.png

 

Opublikowano






#include <iostream>
using namespace std;
int main() {

 unsigned long int l,w,i=1;
	
cout<<"Podaj liczbe : ";
	cin>>l;
	
	do	
	w=2<<i++;	
	while(w<l);
	
if(w!=l)
	{
	if((w-l)<=(w>>2))	cout<<"\nLiczba "<<(w)<<" (2^"<<i<<") jest najblizsza potega wskazanej liczby ";	
		else	cout<<"\nLiczba "<<(w>>1)<<" (2^"<<i-1<<") jest najblizsza potega wskazanej liczby ";
		
	cout<<"\n\n"<<(w>>1)<<" < "<<l<<" > "<<w;
	}
else	cout<<"\nLiczba "<<l<<" jest wynikiem potegi liczby 2 o wykladniku "<<i<<"  -> "<<l<<"=2^"<<i;	

	return 0;
}

@ Mala poprawka ;p

Zarchiwizowany

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

×
×
  • Dodaj nową pozycję...