03. Operators-and-Expressions - 11. 3rd Bit


1

здравейте, колеги,

написах следния код

using System;

namespace _3rd_Bit
{
    class Program
    {
        static void Main(string[] args)
        {
            int N = int.Parse(Console.ReadLine());
            Console.WriteLine(((N/4)%2));
        }
    }
}
BGCoder - а ми дава 63% резултат,

колеги някой може ли да каже защо не 100%




Отговори



1

Твоята програма взима втория бит. Най-десния бит на числото (този на единиците) е нулев. И наляво от него се броят нагоре.


от cuki (7696 точки)


1

Благодаря ти, cuki,

явно битовете се броят от нулев - нещо което не съм взел предвид


от mitkop (578 точки)


1

Интересен израз ((N/4)%2), може ли да обясниш как работи? Предполагах, че само с побитови операции може да се реши, но ми е интересно ако има и други методи за решаване на подобни задачи. Ето моя код:

using System; class ThirdBit { static void Main() { int N = int.Parse(Console.ReadLine()); int mask = 1 << 3; int test = N & mask; int result = test >> 3; Console.WriteLine(result); } }


от ZachD (273 точки)


1
Като се замислиш shift надясно прави деление на 2 на числото, подобно на това как делението на 10 маха последната цифра (десетично). >> 2 ще е също като два пъти / 2 или просто / 4. Колегата така взима втория, а не третия бит. От там идва и грешката.

от cuki (7696 точки)

1

test >> 3 - изместването на битове назад - означава делене на 2, 3 пъти изместване - делене на 8

test << 3 - изместването на битове напред - означава умножени по 2, 3 пъти изместване - умножение по 8

сложното е да предвидиш какво става с изпадащите битове (когато това има значение)


от mitkop (578 точки)


0
using System;

class ExtractBitAtThirdPosition
{
    static void Main()
    {
        int number = int.Parse(Console.ReadLine());
        int position = 3;
        int mask = 1 << position; - Обърни внимание на това
        int result = number & mask; Това 
        int bit = result >> position; и Това
        
        Console.WriteLine(bit);
    }
}