Loading...
remote87 avatar remote87 121 Точки

[Exercise] Operators Expressions and Statements - Problem 9: Bit Destroyer

Здравейте!

Може ли някой просто да ми потвърди реда на мисли - искам да съм сигурен, че съм разбрал правилно побитовите операции и тази задача ми се видя подходяща. Ето кода:

http://pastebin.com/Qswr1FV0

И сега започвам така:

1. Потребителят въвежда някакво произволно число и позиция на бита, който иска да смени. Прочитаме и двете числа.

2. Правим маската, която ни е числото 1, т.к. то представлява в двуичен код 0000 0001 и най-лесно се работи с него.

3. Преместваме първия бит на маската ( 1, защото се започваме да броим от 0 ) наляво с оператор << толкова пъти, колкото е посочил потребителя за променливата position. 

4. С оператора ~ ( тилда, ако не се лъжа ) обръщаме всички битове на маската или: ако p е 3 - 0000 1000 / първия бит е вече преместен 3 пъти наляво / и с ~ вече новота маска е: 1111 0111.

5. С оператора & ( и ) сравняваме двете числа / тяхната двуична репрезентация /, а именно:

ако е въведено числото 42 и p е 3 - навсякъде, където бита на числото 42 е 0, а бита на маската е 1, получваме резултат 1. На позиция 3 съответно вече имаме 1ца / ако бита на 3та позиция на числото 42 е 1 / или 0, ако бита на позиция 3 на числото 42 е 0.

По този начин получаваме битовете на числото 34.

Правилно ли е така или бъркам някъде?

Тагове:
0
Programming Basics 27/08/2015 14:13:11
Filkolev avatar Filkolev 4482 Точки

Относно двоичното представяне на числата, имай предвид, че отляво има толкова на брой водещи нули, колкото да запълнят броя битове на числото в зависимост от типа му. В случая единицата ще има 31 нули, защото е тип int и има 32 бита - 31 нули и накрая единица.

По точка 5 се обърках малко, но не съм сигурен, че са ти съвсем верни разсъжденията. Операторът & е като логическото "и", т.е. за да получиш резултат 1 трябва и двата бита на съответната позиция в двете числа (операндите) да са 1.

Т.е., имайки 1-ци на всички позиции в маската, освен на р-та (в случая 3-та), полученият резултат ще има 0 на р-та позиция, защото има 0 в маската, без значение какво има на тази позиция в числото - 1 & 0 == 0; 0 & 0 == 0. На останалите позиции ще се запазят битовете на числото, понеже маската има 1-ци, т.е. ако числото има 0, резултатът ще има също 0 (0 & 1 == 0), а ако има 1, резултатът пак ще има 1 (1 & 1 == 1). 

1
remote87 avatar remote87 121 Точки

Здравей!

Благодаря много, видях си грешката: от таблицата с резултатите на операторите съм гледал грешната колона, която всъщност е "|" ( или ). Ако не греша, аз съм обяснил действието на оператора "|" ( ИЛИ ) вместо на "&" ( И ). 

Относно запълващите 0-и: да, знам, че според типа на променливата има определен брой водещи нули, но все пак благодаря за hint-а :)

А относно кода и останалата част от разсъжденията ми, ок ли е?

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