• 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

Object Storage Arubacloud
0 głosów
937 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,510 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,510 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,510 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,370 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 (155,700 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,510 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 (155,700 p.)
Jasne :-) Miłego zliczania bitów :-)

Podobne pytania

0 głosów
5 odpowiedzi 1,945 wizyt
0 głosów
1 odpowiedź 236 wizyt
0 głosów
3 odpowiedzi 1,738 wizyt

92,624 zapytań

141,482 odpowiedzi

319,822 komentarzy

62,005 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!

...