Loading...
nikolaykk avatar nikolaykk 94 Точки

Bitwise Operators-Problem 10. * Tri-bit Switch

Здравейте,

Някой може ли да ми кайже къде ми е грешката? Мисля че маската не се измества коректно в ляво (например когато р=59).

Write a program that inverts the 3 bits from position p to the left with their opposites (e.g. 111 -> 000101 -> 010). Print the resulting number on the console.

using System;

    class Program
    {
        static void Main()
        {
            long n = long.Parse(Console.ReadLine());
            int p = int.Parse(Console.ReadLine());

            long mask = (7 << p);
            //TODO: Make the mask needed to invert 3 bits at position p

            long result = n ^ mask;
            //TODO: Use the ^ (XOR) operation with the number and the mask to get the result

            Console.WriteLine(result);

        }
    }

Тагове:
2
Programming Basics
dmaslev avatar dmaslev 25 Точки

Прав си, грешката е в маската. Проблемът е, че се опитваш да преместиш битовете на числото 7 59 пъти наляво. Да обаче числото 7 е инт, т.е. е само 32 бита и след 32-ото преместване битовете не отиват на 33+ позиция, а се връщат в началото. Не знам дали го обясних добре затова пусни този код, за да видиш как точно става преместването.

for (int i = 0; i < 59; i++)
 {
            int a = 7 << i;
            Console.WriteLine(Convert.ToString(a, 2).PadLeft(32, '0'));
 }

Резултата го запазваш в променлива от тип long.Но на лекция за оператори и изрази би трябвало да са ви казали, че операторът '=' е с най-нисък приоритет. Тоест програмата първо прави преместванията на битовете и след това полученият резултат го присвоява на променливата result.

За да работи програмата трябва да кастнеш 7 към long.

long a = 7;
long mask = (a << p);

или

long mask = ((long)7 << p);

 

9
nikolaykk avatar nikolaykk 94 Точки

Благодаря колега,

Не бях обърнал внимание, че точно 7 ми създава проблема, но предполагах че проблема е в големината на някое от числата.

 

2
Cwetkoyy avatar Cwetkoyy 3 Точки

Здрасти! Аз искам да питам това решение на задачата валидно ли е, тъй като виждам някакви цикли тук, а аз още не съм ги учил.

static void Main()
        {
            long n = long.Parse(Console.ReadLine());
            int p = int.Parse(Console.ReadLine());
            long mask = (long)7 << p;
            long result = n ^ mask;
            Console.WriteLine(result);
        }

Поздрави!

0
Blame avatar Blame 6 Точки

Вярно е решението. 

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