No spoko, tylko pytanie jest o integera. Ale spoko, jest rozwiązanie:
public int ChangeSign(int num) {
switch(num) {
case 0:
return 0;
case 1:
return -1;
case -1:
return 1;
case 2:
return -2;
case -2:
return 2;
/* i tak aż do 2 miliardów z obu stron, albo ile nam trzeba */
}
}
Liczba ujemna różni się pierwszym bitem. Komputer realizuje odejmowanie poprzez dodawanie tyle by przekręcić licznik.
Nie testowałem tego, ale teoretycznie dodając 2147483648 (przy 32 bitowym int) powinniśmy przekręcić pierwszy bit uzyskując liczbę odwrotną.
@karakar: "Liczba ujemna różni się pierwszym bitem." - na większości dzisiejszych komputerów nie jest to prawda - inty implementuje się w kodzie uzupełnień do dwóch.
Liczba ujemna w takim zapisie to odwrócone wszystkie bity + 1 (pomijając over/underflowy)
@joypad: Może źle się wyraziłem. Miałem na myśli, że liczby ujemne w pierwszym bicie mają 1, a dodatnie 0. Odejmowanie jest realizowane poprzez przekręcenia licznika. Żeby od 32 bitowego int-a odjąć 1, procesor dodaje 4294967296.
@KozaSWD: nie trzeba być programistą wystarczy minimum wiedzy z matematyki. By odwrócić znak wystarczy pomnożyć przez -1, albo odjąć od 0.
Funkcja powyżej jeśli jest znak "-" to go wycina, a jak nie ma dodaje.
Odpowiedz
Zmodyfikowano
1 raz.
Ostatnia modyfikacja:
23 września 2018 o 19:26
@zorann: Niby jak ma to zadziałać? Według tego co napisałeś program wykona się następująco: dopóki i jest mniejsze niż 0 zwiększ wartość i o 1. Następnie jeśli i jest różne od x, przypisz i wartość równania x*-1.
Rozumiem x*-1 ale do czego to "i" i w jakim celu iterujesz jego inkrementacje? Bez sensu. Samo x*-1 by wystarczyło
No spoko, tylko pytanie jest o integera. Ale spoko, jest rozwiązanie: public int ChangeSign(int num) { switch(num) { case 0: return 0; case 1: return -1; case -1: return 1; case 2: return -2; case -2: return 2; /* i tak aż do 2 miliardów z obu stron, albo ile nam trzeba */ } }
Odpowiedz@joypad: Genialne, a masz może taką samą funkcję dla longów?
Odpowiedztrzeba kupic mocniejszy komputer z koprocesorem ogarniajacym mnozenie.
OdpowiedzJa bym spróbował czegoś trudniejszego np metoda reverse co zwraca parametr int pomnożony razy -1.
Odpowiedz@kokosnh: Z moją zerową wiedzą informatyczną to wciąż ma sens, więc musi działać :)
Odpowiedzif (i == 5) return -5; if (i == -5) return 5;
OdpowiedzLiczba ujemna różni się pierwszym bitem. Komputer realizuje odejmowanie poprzez dodawanie tyle by przekręcić licznik. Nie testowałem tego, ale teoretycznie dodając 2147483648 (przy 32 bitowym int) powinniśmy przekręcić pierwszy bit uzyskując liczbę odwrotną.
Odpowiedz@karakar: sprawdziłem: return (2147483647-x)+2147483647+2;
Odpowiedz@karakar: "Liczba ujemna różni się pierwszym bitem." - na większości dzisiejszych komputerów nie jest to prawda - inty implementuje się w kodzie uzupełnień do dwóch. Liczba ujemna w takim zapisie to odwrócone wszystkie bity + 1 (pomijając over/underflowy)
Odpowiedz@joypad: Może źle się wyraziłem. Miałem na myśli, że liczby ujemne w pierwszym bicie mają 1, a dodatnie 0. Odejmowanie jest realizowane poprzez przekręcenia licznika. Żeby od 32 bitowego int-a odjąć 1, procesor dodaje 4294967296.
OdpowiedzNie umiem programować, ale chyba "i-=2i" by wystarczyło?
OdpowiedzCaptain Obvious? Nie jestem programistą, coś ogarniam ale wolę się upewnić o co chodzi.
Odpowiedz@KozaSWD: nie trzeba być programistą wystarczy minimum wiedzy z matematyki. By odwrócić znak wystarczy pomnożyć przez -1, albo odjąć od 0. Funkcja powyżej jeśli jest znak "-" to go wycina, a jak nie ma dodaje.
OdpowiedzZmodyfikowano 1 raz. Ostatnia modyfikacja: 23 września 2018 o 19:26
@karakar: Dzięki
Odpowiedz@karakar: nie da się pomnożyć przez -1. Jak już to podzielić przez -1 albo pomnożyć razy -1.
Odpowiedz@banan113: Jak najbardziej "mnożyć przez" jest poprawne. https://sjp.pwn.pl/poradnia/haslo/mnozyc;13054.html
Odpowiedz@karakar: nie uznaję tej strony, więc nie jest poprawne.
Odpowiedzint x=i; while (i<0) { i++; } if (i!=x) { i=x*-1; }
Odpowiedz@zorann: Niby jak ma to zadziałać? Według tego co napisałeś program wykona się następująco: dopóki i jest mniejsze niż 0 zwiększ wartość i o 1. Następnie jeśli i jest różne od x, przypisz i wartość równania x*-1. Rozumiem x*-1 ale do czego to "i" i w jakim celu iterujesz jego inkrementacje? Bez sensu. Samo x*-1 by wystarczyło
Odpowiedz@cassper: Poważnie? No patrz, a ja myślałem, że to najprostsza droga do celu, muszę zoptymalizować swoje skrypty ;)
OdpowiedzProste y=x*java.lang.Match.signum(x); To nam daje zawsze odwrotność liczby i powinno działać dla każdego typu
Odpowiedz@cassper: Błąd, powinno być -1*Math.abs(x)*Math.signum(x))
OdpowiedzTam jest BUG! Funkcja z zera robi zero ujemne.
OdpowiedzKiedy masz 2 z matmy, ale chcesz być programistą.
Odpowiedz