Zamiana systemu dziesiętnego na binarny

Zamiana systemu dziesiętnego na binarny
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
0

Piszę rozwiązanie do zadania z code wars https://www.codewars.com/kata/59fca81a5712f9fa4700159a/train/javascript. Mianowicie chciałbym napisać kod który przeliczy mi z systemu dziesiętnego na binarny. Napisałem taki prosty kod

Kopiuj
function calculate(n){
	let resultOfDivision = n / 2;
	return resultOfDivision;
}
function restOfDivsionByTwo(calculate){
	let restOfDivision = calculate % 2;
	return restOfDivision;
}
restOfDivsionByTwo(5);

jedna funkcja mi liczy wynik z dzielenia a druga resztę z dzielenia. I to działa tylko że dla liczby 1 bo teraz muszę napisać warunek sprawdzający czy wynik z funkcji calculate jest większy od zera i ten kod który jest w tej funckji musi się wykonywać tyle razy nie dopóki wynik działania nie będzie równy 0. I moje pytanie jest takie. Jak do tego podejść. Napisać ten warunek w funkcji calculate czy lepiej odrębną funckje która będzie sprawdzać ten warunek i na tej podstawie będzie określać ile razy funkcja calculate ma się jeszcze wykonać.

Silv
Tak na przyszłość: moim zdaniem lepiej nie nazywać tak samo funkcji oraz zmiennej/parametru (u Ciebie: calculate). Jak będziesz kiedyś przekazywać funkcje w argumentach, to może się pomylić. A generalnie: im mniej takich samych nazw w JavaScripcie, tym lepiej.
LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:minuta
  • Postów:8403
2

Jakbyś chciał na skróty pójść to liczby w JS mają metodę toString, która przyjmuje parametr radix:

Kopiuj
n.toString(2);  // np. jeśli n == 6, to zwróci "110"

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number/toString


edytowany 1x, ostatnio: LukeJL
P1
Wiem dzięki ale chce napisać własny algorytm
LukeJL
poczytaj więc o operatorach bitowych <<, >>, &, bo to ci się może przydać. Zamiast dzielić i szukać reszty z dzielenia, to możesz przesuwać bity i robić operację bitową AND, żeby sprawdzić, czy dany bit jest zapalony https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Left_shift https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Right_shift https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_AND
P1
  • Rejestracja:ponad 7 lat
  • Ostatnio:2 miesiące
  • Postów:639
0

A że tak zapytam. Konwersja systemu dziesiętnego na binarny polega na dzieleniu określonej liczby przez 2, uzyskanie wyniku z dzielenia a także reszty z tego dzielenia. Zasada jest taka że jeśli mam liczbę 1 to ten kod który napisałem tak naprawdę wystarczy tyle że problem pojawia się przy liczbach większych od 1. Dlatego że należy napisać warunek sprawdzający czy wynik z dzielenia jest większy od 0 i jeśli jest to wykonuje się dotąd dopóki nie dotrze do 0 (czyli dopóki 0 nie będzie równe 0). Natomiast gdy osiągnie wartość to popierwsze powiniene być warunek który sprawdza czy 0 > 0 no i to jest fałsz i tym samym przerywam wykonywanie instrukcji warunkowej. Tylko żeby móc dojść do określonej wartości jaką jest 0 przydałoby się wykorzystać tutaj pętle. I chciałbym się dowiedzieć czy pętla while lub ewentualnie do while by zdały egzamin?

Zobacz pozostałe 3 komentarze
LukeJL
nie wiem, pewnie można to rozwiązać na różne sposoby. Mnie się udało wykminić 2 póki co (ten, który napisałem tutaj i ten z operatorami bitowymi. Nie wrzucam kodu póki co, żeby nie spojlerować rozwiązania).
LukeJL
BTW podzielić ponownie przez dwa do momentu kiedy wynik nie będzie równy 0 - nie będzie tak nigdy (w sensie, że jak będziesz dzielił liczbę przez 2, to wyjdą ci na końcu ułamki tj. chyba, że za okrąglisz do liczby całkowitej i np. 1/2 = 0.5 zaokrąglisz do zera, ew. uznasz, że 1/2 to "zero reszty 1, bo 0 * 2 + 1 = 1).
LukeJL
ale tak, to ma sens pętle while żeby się wykonywała dla każdego wyniku większego od 0 a w środku umieścić instrukcje if która by sprawdzała czy wynik jest większy od 0. Jeśli jest większy to ten wynik podzielić ponownie przez dwa do momentu kiedy wynik nie będzie równy 0. -- z tym, że zamiast 0, podstaw sobie 1 (dla każdego wyniku >= 1). Czyli dzielisz swoją liczbę (zaokrąglając do jedności w dół używając Math.floor) aż aktualna liczba bd wynosiła 1. Wtedy koniec. W międzyczasie w każdej iteracji liczysz resztę z dzielenia (liczba % 2) i to będzie kolejna cyfra(0 lub 1)
LukeJL
czyli można zrobić na co najmniej 3 różne sposoby - operacje bitowe(>>, <<. &), sposób, który iteruje po kolejnych potęgach dwójki, no i ten sposób, który napisałeś z dzieleniem przez 2. A pewnie i więcej sposobów możnaby wykminić.
P1
Dziękuję za pomoc. Napiszę swoje rozwiązanie ale chciałbym poznać też twoje
enedil
  • Rejestracja:ponad 11 lat
  • Ostatnio:około 17 godzin
  • Postów:1027
2

To nie jest tak, że liczba na wejściu jest dziesiętna. Liczby w komputerach zawsze są zapisywane w jakiś sposób binarnie. To co chcesz, to chcesz uzyskać binarną reprezentację liczby. Nie liczby dziesiętnej, po prostu liczby. Przepraszam za może nie do końca pomocny post, ale może pomoże trochę w zrozumieniu.

LukeJL
  • Rejestracja:około 11 lat
  • Ostatnio:minuta
  • Postów:8403
1

Dziękuję za pomoc. Napiszę swoje rozwiązanie ale chciałbym poznać też twoje

Np. sposób z dzieleniem przez 2:

Kopiuj
const number = 7;
const base = 2;

let v = number, s = '';
while (v >= 1) {
	s = (v % base) + s ;
	v = Math.floor(v / base);
}

sposób z bitami:

Kopiuj
const toB = n => { 
   let s = ''; 
   for (let i = 0; n >= 1 << i;  s = (n >> i++ & 1) + s) ;  
   return s;
}

sposób z iterowaniem kolejnych potęg:

Kopiuj
const number = 7;
const base = 2;

let left = number;
let divisor = base;
let arr = [];
do {
    const v = left % divisor;
    arr.unshift(v / (divisor / base));
    left -= v;
    divisor *= base;
} while (left);

console.log(arr.join('')); 

(tu zamiast stringa s użyłem tablicy, ale to akurat nie wpływa na sam algorytm. Mógłbym tu zrobić dodawanie stringow tak jak w poprzednich)


edytowany 1x, ostatnio: LukeJL
P1
Widzę że w tym pierwszym rozwiązaniu wykorzystujesz pętlę while bez ifa. Dlaczego?
LukeJL
bo pętla while ma już sprawdzanie warunku w nawiasie while (v >= 1), czyli: wykonuj dopóki warunek v >= 1 jest spełniony (jak przestaje być spełniony, to przerwij pętlę).
P1
Aha. Czyli w tym przypadku if jest nie potrzebny?
LukeJL
w moim przypadku nie był, ale możliwe, że podchodząc inaczej do problemu, będziesz miał potrzebę użycia ifa gdzieś w środku pętli.
P1
A jeśli chciałbym sprawdzić czy wnik z działania który trafił do pętli jest większy od 0 to czy jest sens używania ifa skoro w pętli jest zapisany warunek wynik > 0 lub wynik >= 1?
LukeJL
jeśli masz pętlę while (WARUNEK) { ...... }, to PRZED każdą iteracją jest sprawdzany warunek. A potem przechodzi iteracja i warunek znowu jest sprawdzany przed wejściem w kolejną iterację itp.. Natomiast pętla do {....} while (WARUNEK) najpierw się uruchomi i PO każdej iteracji sprawdzany jest warunek. Jednak przed pierwszą iteracją nie jest sprawdzany, więc nawet jeśli warunek będzie fałszywy, to pętla do {...} while (..) wykona co najmniej jedno okrążenie/iterację. Pętla while (...) {} może się w ogóle nie uruchomić.
LukeJL
czy jest sens używania ifa - zamiast pytać o sens używania ifa, zastanów się nad tym, w jaki sposób program się uruchomi, weź go sobie odpal w głowie, które warunki będzie sprawdzać, kiedy wyjdzie z pętli itp. Wtedy zobaczysz, czy if w twoim przypadku ma sens.
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)