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

Hej! Mam problem z kodem w js który ma za zadanie wypisać liczbę cyfr 1 w kodzie binarnym

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
1,219 wizyt
pytanie zadane 4 września 2017 w JavaScript przez mikolaj_c Początkujący (290 p.)

kod ma pobrać liczbe w systemie dziesiętnym a następnie podać liczbe jedynek gdyby ta sama liczba była zapisana w systemie binarnym.

oto kod:

var countBits = function(n) {
  var o=0;
  for(var i=n;i==0;)
  {
    if(i%2==1)
    {
      i--;
      i=i/2;
      o++;
    }else
    {
      i/2;
    }
  }
  return o;
};

 

4 odpowiedzi

+1 głos
odpowiedź 4 września 2017 przez Tomek Sochacki Ekspert (227,490 p.)
wybrane 4 września 2017 przez mikolaj_c
 
Najlepsza

a może coś takiego?

const countBits = function( n ) {
	const bit = n.toString( 2 );
	bitAsArray = bit.split( '' );
	
	return bitAsArray.reduce( ( a,b ) => {
		return +a + +b;
	}, 0 );
}

( 15 ).toString( 2 ); //"1111"
countBits( 15 );      //4

( 20 ).toString( 2 ); //"10100"
countBits( 20 );      //2

 

Pomysł jest taki, aby liczbę przekonwertować do postaci binarnej ale jako string, następnie stringa rozdzielić na tablicę i zsumować wszystkie jej elementy. Pytanie jak duże liczby masz bo przy bardzo dużych to nie będzie wydajne rozwiązanie...

komentarz 4 września 2017 przez niezalogowany

Właśnie o ten średnik się rozchodzi

const countBits = function( n ) {
    const bit = n.toString( 2 );
    bitAsArray = bit.split( '' );
     
    return bitAsArray.reduce( ( a,b ) => {
        return +a + +b;
    }, 0 );
} // <- tutaj mamy referencję do funkcji
 
( 15 ) // <- tu ją wywołujesz - zwraca: 4
.toString( 2 ) // <- zmiana na string: "100"
// i przypisanie do zmiennej
komentarz 4 września 2017 przez Tomek Sochacki Ekspert (227,490 p.)

hmm nie bardzo nadal rozumiem?

const countBits = function( n ) { //załóżmy n = 15
    const bit = n.toString( 2 );  //'1111' string
    bitAsArray = bit.split( '' ); //["1", "1", "1", "1"]
      
    return bitAsArray.reduce( ( a,b ) => {
        return +a + +b;
    }, 0 );
    //reduce sumuje liczby, a nie dokonuje konkatenacji
}

Ostatecznie otrzymujemy typ number, czyli sumę jedynek, więc jednocześnie ich ilość (w systemie binarnym można było przyjąć takie uproszczenie). A zamianę na string metodą toString( 2 ) robię po to, aby po 1. mieć postać binarną, a po drugie móc użyć String.prototype.split.

Chyba, że już dzisiaj zbyt cięzżko myślę i nie widzę błędu to najwyżej jutro ze świeżą głową jeszcze raz popatrzę :)

Tak na marginesie to pytanie również, jak funkcja ma zachowywać się na liczbach ujemnych bo tutaj mogą być pewne problemy, zależnie od tego jaką postać binarną liczby ujemnej chcemy otrzymać do sumowania jedynek.

1
komentarz 4 września 2017 przez niezalogowany

Zasadniczo wnętrze funkcji jest tutaj nieważne. Ważne jest, że  (15) wywołuje funkcję anonimową z argumentem 15

funkcja zwraca 4

( 4 ).toString( 2 ) // "100"

const countBits = function( n ) { return 4 } ( 15 ) .toString( 2 ); // "100"
komentarz 5 września 2017 przez Tomek Sochacki Ekspert (227,490 p.)

heh, o kurde... :)

testowałem to na szybko w konsoli więc najpierw zrobiłem funkcję, enterek, i potem dopiero ją wywoływałem dla 15 i 20 dlatego nie dostrzegłem tego problemu.

Ale wielki plus za znalezienie tego de facto błędu, nie ma co ukrywać. Osobiście jestem zwolennikiem stawiania średników i tak też mam ustawionego eslinta, ale widać, że czasami warto popisać kod trochę po za IDE :) tak z ciekawości muszę sobie wolnej chwili przejrzeć mojego codewarsa pod tym względem :)

Wspominałeś wcześniej o jakieś dyskusji nt. średników, a masz może jakiś link do niej?

Pozdrawiam

+1 głos
odpowiedź 4 września 2017 przez Velta Maniak (52,790 p.)

Moja propozycja:

var countBits = function(n) {
	return n.toString(2).split("1").length - 1;
}

 

0 głosów
odpowiedź 4 września 2017 przez niezalogowany
Co robi 12 linijka?
komentarz 4 września 2017 przez mikolaj_c Początkujący (290 p.)
Dzięki

racja powinno być i=i/2;

ale kod nadal nie działa
0 głosów
odpowiedź 4 września 2017 przez mokrowski Mędrzec (156,320 p.)
function countBits(n)
{
     n = n - ((n >> 1) & 0x55555555);
     n = (n & 0x33333333) + ((n >> 2) & 0x33333333);
     return (((n + (n >> 4)) & 0x0F0F0F0F) * 0x01010101) >> 24;
}

 

komentarz 4 września 2017 przez Tomek Sochacki Ekspert (227,490 p.)
heh... oki, funkcja działa... ale o jej czytelności można by dyskutować :)

Nie mniej fajne rozwiązanie, osobiście lubię zabawy z liczbami binarnymi (i ogólnie systemami liczbowymi) i operatorami binarnymi więc w wolnej chwili chętnie przyjrzę się bliżej Twojemu rozwiązaniu :)
komentarz 4 września 2017 przez mokrowski Mędrzec (156,320 p.)
Jasne :-) Miłego zliczania bitów :-)

Podobne pytania

0 głosów
5 odpowiedzi 2,111 wizyt
0 głosów
1 odpowiedź 283 wizyt
0 głosów
3 odpowiedzi 1,998 wizyt

93,173 zapytań

142,184 odpowiedzi

321,968 komentarzy

62,502 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 1157p. - dia-Chann
  2. 1139p. - Łukasz Piwowar
  3. 1131p. - CC PL
  4. 1126p. - Łukasz Eckert
  5. 1118p. - Tomasz Bielak
  6. 1104p. - Michal Drewniak
  7. 1083p. - Marcin Putra
  8. 1078p. - rucin93
  9. 1071p. - rafalszastok
  10. 1054p. - Adrian Wieprzkowicz
  11. 1047p. - Piotr Aleksandrowicz
  12. 1037p. - Michał Telesz
  13. 1017p. - Mikbac
  14. 1005p. - ssynowiec
  15. 992p. - Dominik Łempicki (kapitan)
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...