Loading...
angel7 avatar angel7 1 Точки

Problem 14.Modify a Bit at Given Position

Здравейте!

Може ли малко помощ за задачата. При въвеждане на 1 се получава верен отговор, но при 0 не съвпада с това от домашното.

   Console.WriteLine("Type your number:");
        int number = int.Parse(Console.ReadLine());
        Console.WriteLine("Type the position:");
        int position = int.Parse(Console.ReadLine());
        Console.WriteLine("Type your value 1 or 0:");
        int value = int.Parse(Console.ReadLine());
        if (value == 1)
        {
            value = 1 << position | number;
            Console.WriteLine("{0}", value);
        }
        else
        {
            value = 0 << position | number;
            Console.WriteLine("{0}", value);
        }

 

ModEdit: Моля прочети правилата на форума в частта им за именуване на темите.

Тагове:
-1
Programming Basics 25/06/2015 14:49:03
Filkolev:
На въпроса е отговорено.
enevlogiev avatar enevlogiev 1168 Точки

Aлгоритъмът да смениш някой бит от 1 на 0 е малко по-различен.

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

Примерно имаш да смениш бита на позиция 2.

int mask = 1 << position; // position = 2.
резултат: 0000 0100.

Сега го обръщаме: mask = ~mask;
резултат: 1111 1011.

След като сме готови с маската, може да я сравним с числото, което трябва да променим. За целта използваме оператора &. Toй връща 1 като резултат единствено, ако на една и съща позиция има две единици. Във всеки друг случай дава 0.

number = number & mask.

0000 0101 // битово 5
&
1111 1011
=
0000 0001 // битово 1.

Съкратен, горният алгоритъм може да се представи като number &= ~(1 << position).

Kато полезна информация, може да запомните тази формула и още една: number |= 1 << position. Тези две формули решават около 90% от всички битови задачи, давани на изпит. Ако се работи с 64-битове числа (long, ulong), е необходимо 1 да се кастне към съответния тип, тоест number &= ~((ulong)1 << position), респективно и при другата формула

3
15/06/2015 21:27:32
angel7 avatar angel7 1 Точки

Благодаря! Малко ми е сложно да разбера това с маската.

0
enevlogiev avatar enevlogiev 1168 Точки

Единственият начин да смениш бит от 1 на 0, е да го сравниш със 0 и оператора &. Eто как работят трите логически оператора:
1 & 0 = 0;
1 | 0 = 1;
1 ^ 0 = 1;
T.е. в едно число, за да сменим бит на дадена позиция от 1 на 0, ние трябва да го сравним с маска, която на съответната позиция има 0.  Може директно да сравним с числото 0 (0000 0000), но така ще нулираме абсолютно всички единици. За да запазим битовете, които не трябва да пипаме, правим всички битове в маската на единици, освен този, който ще променяме. Примерно 1011 1111 - нулира бит на позиция 6. 1011 1101 - ще нулира битове на позиция 6 и 1.
 

2
angel7 avatar angel7 1 Точки

Благодаря, разбрах.

0
stiliqnivanov avatar stiliqnivanov 16 Точки

Здравей,

Можеш да използваш също този израз:

n=n^(v<<p);

n - числото ; p - стъпка ; v - 0,1

Това е Изключващо ИЛИ

Като преди това си правиш проверка с IF дали бита, който искаш да смениш съвпада с v.Ако съвпада не променяш нищо.

Поздрави !

 

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