Loading...
kirchev95 avatar kirchev95 12 Точки

Брояч на битове (1 или 0)

Здравейте колеги днеска цял ден се мъча върху една задача с битови операции. Тук ще намерите пълното Условие (Binary Digits Count) на задачата. На кратко задачата е следната. Когато се търси броя на 1-ците програмата ми работи иделано. Но когато търся броят на 0-лите прогрмата се побърква. Мога ли да разчитам някой да ми помогне просвещавайки ме къде ми е  грешка. Забравих да кажа броенето на нулите го взех от stackoverflow.

Благодаря предварително.

Тагове:
0
Programming Basics
TeodorTodorov avatar TeodorTodorov 27 Точки

Не изглежда сложно, хвани се с дебъгера, ако не целя ефективност, тази задача бих я напълнил в масив, че даже и стринг става ( записвам си бинарната репрезентация в масив, обикалям елементите и сръвнявам, ако имам едно countOne++ или countZero++ etc и за другите числа)

0
ViValDam avatar ViValDam 15 Точки

Не само за ефективност, Наков каза да нучим битовите операции, защото трябват за програмиране на ембедит системс - не може без тях !

1
dimitarstoyanov90 avatar dimitarstoyanov90 164 Точки

Примерно решение  ->>> Това е едно примерно решение(на колеги), което смятам за добро разгледай го и ако има нещо питай :) Успех !

А ето ти и мое такова, което е малко хамалогия но работи 100/100 (Даже сега като си го погледна и видя колко глупави са някои работи... Но идеята е, че самата логика бачка )

using System;
class ZeroOneCounter
{
static void Main(string[] args)
{
Int64 B = Convert.ToInt64(Console.ReadLine());
Int64 N = Convert.ToInt64(Console.ReadLine());
Int64[] nextDigitsArray = new Int64[N];

for (int i = 0; i < N; i++)
{
Int64 nextDigitsInput = Convert.ToInt64(Console.ReadLine());
nextDigitsArray[i] = nextDigitsInput;
}

int[] countOfZeros = new int[1];
int[] countOfOnes = new int[1];

if (B == 1)
{
         for (int i = 0; i < nextDigitsArray.Length; i++)
{
countOfOnes[0] = 0;
while (nextDigitsArray[i] > 0)
{
                   if (nextDigitsArray[i] % 2 == 0)
{
countOfZeros[0] = countOfZeros[0] + 1;
}
else if (nextDigitsArray[i] % 2 == 1)
{
countOfOnes[0] = countOfOnes[0] + 1;
}
nextDigitsArray[i] = nextDigitsArray[i] / 2;
}
Console.WriteLine(countOfOnes[0]);
}
}

if (B == 0)
{
for (int i = 0; i < nextDigitsArray.Length; i++)
{
countOfZeros[0] = 0;
while (nextDigitsArray[i] > 0)
{
if (nextDigitsArray[i] % 2 == 0)
{
countOfZeros[0] = countOfZeros[0] + 1;
}
else if (nextDigitsArray[i] % 2 == 1)
{
countOfOnes[0] = countOfOnes[0] + 1;
}
nextDigitsArray[i] = nextDigitsArray[i] / 2;
}
Console.WriteLine(countOfZeros[0]);
}
}
}
}
0
beBoss avatar beBoss 507 Точки

В C# е прието е да се пише long вместо int64 по конвенция.

2
dimitarstoyanov90 avatar dimitarstoyanov90 164 Точки

Това е решение, което съм писал преди над 10тина месеца и нормално да има такив а недоразумения както съм споменал. Мерси за уточнението. Самата задача я постнах за да може да се проследи логиката, която използвам, което в случая е важното:)  ("Даже сега като си го погледна и видя колко глупави са някои работи... Но идеята е, че самата логика бачка !!!")

1
bonchovylkov avatar bonchovylkov 9 Точки

Ако искаш може да ползваш и побитовите оператори. Не са толкова интуитивни, но са доста по бързи, и понякога спестяват доста писане! 


public static int GetBitOnPosition(int number, int pos)
{

return (number & (1 << pos)) != 0? 1:0;
}

public static bool IsBitOne(int number, int pos)
{

return (number & (1 << pos)) != 0;
}

 

ползва се така:

int bit = GetBitOnPosition(100,5) - - тоест ще върне бита на числото 100 на 5 позиция, броено от ляво на дясно!

другия метод само казва дали бита е единица или нула.

2
ViValDam avatar ViValDam 15 Точки
Ами то си трябва да се реши така - с побитови операции. И аз ги намирам за лесни . Просто всички се страхуват от тях и не желаят малко да помислят и ги разберат .
1
jokerbg avatar jokerbg 46 Точки

Не е необходимо да се слага отделен код за броене на нули и единици - иска се или едното, или другото, като броенето е идентично при двата сценария ... ето просто решение в 20 реда:

 

using System;
class BinaryDigitsCount
{
    static void Main()
    {
        uint B = uint.Parse(Console.ReadLine());
        int count = 0;
        ushort n = ushort.Parse(Console.ReadLine());
        for (int i = 0; i < n; i++)
        {
            uint number = uint.Parse(Console.ReadLine());
            while (number != 0)
            {
                if ((number & 1) == B)
                    count++;
                number = number >> 1;
            }
            Console.WriteLine(count);
            count = 0;
        }
    }
}

3
g.stoyanov avatar g.stoyanov 776 Точки

Ето и едно решение с Linq:

using System;
using System.Linq;
class Program
{
....static void Main()
....{
........char binaryChar = Console.ReadLine()[0];
........int numberOfNum = int.Parse(Console.ReadLine());
........for (int i = 0; i < numberOfNum ; i++)
........{
............long number = long.Parse(Console.ReadLine());
............string binary = Convert.ToString(number, 2);
............Console.WriteLine(binary.Count(ch => ch == binaryChar));
........}
....}
}

0
kirchev95 avatar kirchev95 12 Точки

Колеги много Ви благодаря. Сега като погледнах решенията видях, че не е било чак толкова трудно, та чак ме хваща яд що не съм я решил laughing

1
Можем ли да използваме бисквитки?
Ние използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Можете да се съгласите с всички или част от тях.
Назад
Функционални
Използваме бисквитки и подобни технологии, за да предоставим нашите услуги. Използваме „сесийни“ бисквитки, за да Ви идентифицираме временно. Те се пазят само по време на активната употреба на услугите ни. След излизане от приложението, затваряне на браузъра или мобилното устройство, данните се трият. Използваме бисквитки, за да предоставим опцията „Запомни Ме“, която Ви позволява да използвате нашите услуги без да предоставяте потребителско име и парола. Допълнително е възможно да използваме бисквитки за да съхраняваме различни малки настройки, като избор на езика, позиции на менюта и персонализирано съдържание. Използваме бисквитки и за измерване на маркетинговите ни усилия.
Рекламни
Използваме бисквитки, за да измерваме маркетинг ефективността ни, броене на посещения, както и за проследяването дали дадено електронно писмо е било отворено.