Софтуерно Инженерство
Loading...
+ Нов въпрос
kirchev95 avatar kirchev95 12 Точки

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

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

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

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

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

0
ViValDam avatar ViValDam 23 Точки

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

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 513 Точки

В 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 23 Точки
Ами то си трябва да се реши така - с побитови операции. И аз ги намирам за лесни . Просто всички се страхуват от тях и не желаят малко да помислят и ги разберат .
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 760 Точки

Ето и едно решение с 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