Професионална програма
Loading...
vmkoleva avatar vmkoleva 12 Точки

Problem 9.Bit Destroyer (Write a program that sets the bit at position p to 0. Print the resulting number.)
Задачата е от упражнението, не от домашната. Изчетох всички разяснения, които сте писали и схванах как горе долу работят побитовите оператори. Въпроса ми тук е, че не мога да открия грешката си в задачата (или може би няма такава), а има грешка в примерните отговори, дадени в задачата, добавих ги след решението. 111 ми се получава отговора, но останалите - не. Помъчих се доста време, но не успях да се справя. Така че ако може малко помощ. 

class BitDestroyer
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Write a number n:");
            int n = int.Parse(Console.ReadLine());
            Console.WriteLine("Write a position p:");
            int p = int.Parse(Console.ReadLine());
            long result = long.Parse(Convert.ToString(n, 2));
            long mask = n << p;
            long invertmask = ~mask;
            long newNumber = n & mask; 
            Console.WriteLine(newNumber);
            
        }
    }

n -  p - Result
1313 - 5 - 1281
231 - 2 - 227
111 - 6 - 47

 

0
08/06/2015 18:11:06
Manoela avatar Manoela 7 Точки

пробах твоя код с 111 и ми даде отговор 64.

Маската трябва да е единица, преместена на позицията на търсения бит. 

Така както си го написал събираш n с преместен n. 

за да сработи, трябва да си направиш маска от 1, преместена на нужната позиция. После си правиш тилда от маската, за да остане 0 под нужния бит и 1 под всички останали. И &. Така само където е било 1 в оригиналтото число,  при & 0  дава 0, тоест the bit is destroyed. Всички други битове при & с 1ците на маската не се променят.

Не знам дали обеснението ми е ясно, дано помогнах.

Моето решение е това:

            int n = int.Parse(Console.ReadLine());
            int p = int.Parse(Console.ReadLine());
            int mask = ~(1 << p);

            int result = n & mask;
            Console.WriteLine(result);

 

 

0
vmkoleva avatar vmkoleva 12 Точки

Благодаря много, че помогна :) 

0