Loading...
Pafo37 avatar Pafo37 21 Точки

Problem 14. Modify a Bit at Given Position

Понеже не съм напълно наясно с битовете, реших да реша и нерешените ми задачи от домашното и попаднах на тази.Не можах да измисля моя решение и затова намерих това -> https://github.com/Sasho80/3.Operators-Expressions-and-Statements/blob/master/14.Modify%20a%20Bit%20at%20Given%20Position  .Проблемът е че не го разбирам и дали ще е възможно да ми го обясните? 

Ето и условието:

We are given an integer number n, a bit value v (v=0 or 1) and a position p. Write a sequence of operators (a few lines of C# code) that modifies n to hold the value v at the position p from the binary representation of n while preserving all other bits in n

Тагове:
0
Programming Basics
RoYaL avatar RoYaL Trainer 6849 Точки

Здрасти,

Ами решението горе долу е самообяснено. Нека го разгледаме в детайли.

Ако имаме числото 7 то е 000..00111. Искаме да модифицираме битът на 2ра позиция и да го направим 1ца, т.е. да не го променяме. Ами това означава, че ако там има 1ца трябва да я запазим 1ца, а ако има нула - да я направим единица.

За да получим винаги единица без значение какво има на тази позиция трябва да ползваме OR с 1ца, защото OR с кое да е true (1) връща true(1)

1 OR 1 = 1 (1 | 1 = 1)

0 OR 1 = 1 (0 | 1 = 1)

Останалите битове трябва да ги OR-нем с нула, защото така няма да ги променим. Ако са били нули ще си останат нули, ако са били единици ще си останат единици, защото 0 OR 0 = 0 и 1 OR 0 = 1.

Така, че числото, с което трябва да OR-нем е число което има 1ца на тази позиция (2) и нули на всички сотанали позиции.

Ами най-лесно е да вземем числото 1 (00...0001) и да му преместим всички битове, респективно единствената единица, с 2 позиции на ляво. 1 << 2 (да приемем, че двойката "p" - позиция: 1 << p). Така ще получим числото 00...00100. Това е маската или променливата MASK. Числото 7 (00.00111) е "N"

Тогава трябва да направим OR между N и MASK

000..00111 (N)

OR

000..00100 (MASK)

=

000..00111 (новото число)

Т.е. променихме (или по-скоро запазихме) бита на 2ра позиция на 1ца.

Ако числото имаше бит 0 на тази позиция (числото 5, което е 000..00011). Същата практика ще го обърне на 1ца

000..00011 (N)

OR

000..00100 (MASK)

=

000..00111 (новото число)

Ако искаме да променим обаче битът на 0, без значение какъв бит е имало там, трябва да направим AND с 0. Защото каквото и да е AND-нато с FALSE (0) връща FALSE (0).

0 AND 0 = 0 (0 & 0 = 0)

1 AND 0 = 0 (1 & 0 = 0)

Тогава трябва да направим побитов AND (&) с НУЛА на тази позиция и ЕДИНИЦА на всички останали, за да запазим останалите битове - ако са били единици, като се AND-нат с 1ци ще останат 1ци (1 & 1 =1), а ако са били нули, като се AND-нат с нули ще останат нули (0 & 1 = 0).

Нека пак имаме числото 7 (000..00111) и се опитаме да сменим битът на 2ра позиция на 0 (в момента е 1).

Взимаме числото 1 (000..0001) местим му всички битове на ляво с 2 (p) и става отново 000..0100 (1 << 2). Сега използваме операторът ТИЛДА за да обърнем всички единици на нули и всички нули на единици. ~ (1 << 2). И става 111..11011 Това е нашата маска (MASK)

По логиката по горе, прилагаме AND на двете числа (N, което искаме да му променим бита) и MASK (маската)

000..00111 (N)

AND

111..11011 (MASK)

=

000..00011 (резултат)

 

Поздрави,

Иван

2
13/01/2016 17:54:02
Pafo37 avatar Pafo37 21 Точки

Благодаря ти много!

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