• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

operacje binarne

Object Storage Arubacloud
–1 głos
713 wizyt
pytanie zadane 22 października 2018 w Java przez Pioter Nowicjusz (120 p.)

Dana jest zmienna typu int o wartosci 43707 utwórz program wyswietlajacy wartosc liczbową jaka jest zapisana na bitach parzystych jako zmienna even a na nieparzystych jako zmienna odd obie zmienne wyswietl na ekranie.
Jakieś sensowne propozycje sam mam jedno rozwiązanie ale nawet nie wiem dlaczego działa. 

Liczę na jakąś pomoc bo nigdzie jej nie ma!

1
komentarz 22 października 2018 przez Sheida Użytkownik (950 p.)
Na ss niestety nic nie widać, skopiuj proszę kod i wklej go w tagi, które można użyć w poście.
2
komentarz 22 października 2018 przez X3h Dyskutant (9,540 p.)

@Pioter, regulamin nie gryzie tak samo jak szacunek.

komentarz 22 października 2018 przez Pioter Nowicjusz (120 p.)
edycja 22 października 2018 przez Arkadiusz Waluk
public class Zad3
{
    static int Odd;
    //dana jest zmienna typu int o wartosci 43707 utworz program wyswietlajacy wartosc liczbowa jaka jest zapisana na bitach
    //parzystych jako zmienna even a na nieparzystych jako zmienna odd obie zmienne wyswietl na ekranie
    public static void main(String[] args)
    {
        int x = 43707;
        int odd =0;
        int even =0;
        int q=0;
        System.out.println(Integer.toBinaryString(43707)); //1010101010111011
        System.out.println(0b11111111); //255
        System.out.println(0b00000101); //5
        while(q<32){
            even +=(x%2)*(Math.pow(2,q));
            x=x/2;
            odd +=(x%2)*(Math.pow(2,q));
            x=x/2;
            q+=1;
        }
            System.out.println(even);
            System.out.println(odd);
        
    }
}
komentarz 22 października 2018 przez Pioter Nowicjusz (120 p.)
Wybaczcie panowie pytanie raczej o sposób załatwienia tego przy użyciu operacji bitowych, ponieważ taki był cel a sam kod raczej do niczego ani mi ani wam daje tylko do analizy jesli ktoś chciałby spróbować zrozumiec o co chodzi :C.

3 odpowiedzi

0 głosów
odpowiedź 22 października 2018 przez RafalS VIP (122,820 p.)

Wybacz, stwierdziłem, że szybciej będzie to napisać. Zostawiłem komentarze może poza skopiowaniem jeszcze coś zrozumiesz :P

public class Test {
    public static void main(String[] args) {
        int number = 54535;
        System.out.println(number + " binarnie: " + Integer.toBinaryString(number));
        int evenMask = 0b01010101010101010101010101010101;
        //lub tak samo hexem
        //int evenMask = 0x55555555;
        // int oddMask = 0b10101010101010101010101010101010;
        int oddMask = 0xAAAAAAAA;
        //logiczne and, daje 1 tylko dla dwoch jedynek
        //wiec taka maska zeruje bity na parzystych miejscach
        int evenPart = number & evenMask;
        int oddPart = number & oddMask;
        System.out.println("Odd: " + Integer.toBinaryString(oddPart) + " co daje " + oddPart);
        System.out.println("Even: " + Integer.toBinaryString(evenPart) + " co daje " + evenPart);
    }
}

 

0 głosów
odpowiedź 22 października 2018 przez criss Mędrzec (172,590 p.)

Wystarczy, że zrobisz sobie tak zwaną maske z ustawionymi parzystymi lub nieparzystymi bitami i potem wykonasz iloczyn bitowy tamtej liczby z tą maską oraz drugi iloczyn bitowy z negacją maski. Zakładam, że int w javie jest 32bitowy (nie wiem jak to wygląda w javie):

int a = 43707;
int mask = 0b01010101010101010101010101010101; //tosamo mozesz zapisac krocej w postaci hex: 0x55555555
int even = a & mask;
int odd = a & (~mask);

 

0 głosów
odpowiedź 23 października 2018 przez Aisekai Nałogowiec (42,190 p.)
edycja 23 października 2018 przez Aisekai
Program nie jest tak trudny, jak wygląda. Even i odd jest sumą reprezentującą liczbę decymalnie (chociaż wg mnie powinny być zamienione bo odd przechowuje tutaj zapis na parzystych pozycjach (licząc od tyłu) a even - nieparzystych). Ale do rzeczy:

W linii 16, x%2 zwraca tak na prawdę ostatnią cyfrę liczby zapisanej binarnie. Jeżeli jest nieparzysta - wynikiem będzie 1, jeżeli parzysta  - 0. Potem mnożysz to przez 2^q, gdzie q będzie pozycją w zapisie binarnym, zmiennych even i odd.

W linii 17 dzieląc liczbę przez 2, przesuwasz ją o jedno miejsce w prawo (ze względu, że jest to int, część dziesiętna będzie "odcięta").

W linii 18, robisz to samo co w linii 16 tylko dodajesz do zmiennej odd.

W linii 19, znów przesuwasz liczbę w prawo.

W linii 20. zwiększasz numer pozycyjny o 1, dla zmiennych even i odd. To wszystko wykonujesz do czasu aż q nie będzie większe bądź równe 32 (32 numery pozycyjne w zmiennych even i odd) - według mnie wystarczyłoby do 16, bo int ma pojemność 4 bajtów, a za każdą iteracją pętli "przesuwasz" tak naprawdę x o 2 miejsca w prawo.

Edit: to jest wytłumaczenie (trochę skomplikowane) tego jak działa ten algorytm co wstawiles

Podobne pytania

0 głosów
1 odpowiedź 532 wizyt
pytanie zadane 9 marca 2019 w Java przez mn130496 Gaduła (3,530 p.)
+1 głos
1 odpowiedź 928 wizyt
0 głosów
2 odpowiedzi 139 wizyt
pytanie zadane 29 stycznia 2019 w Java przez Patryk01 Obywatel (1,270 p.)

92,556 zapytań

141,404 odpowiedzi

319,560 komentarzy

61,942 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...