[C#] Operators, Expressions and Statements - 5 задача


2

 

Условие:  Write a boolean expression for finding if the bit 3 (counting from 0) of a given integer is 1 or 0.
 
Понеже аз си го превеждам така: "Напишете булев израз за да намерите каква е стойноста на 3-тия бит (като броенето започва от 0, един вид 4-тия) от въведено цяло число, 1 или 0.
След като пише "булев израз" може ли да се ползват побитовите оператори или само логическите (които работят с булеви стойности и сформират булеви изрази)? Или трябва поне да е хибрид (да съдържа и от двата вида)?



Отговори



4
Според мен "хибрид", ползваш побитови за определянето на 4тия бит и после си правиш една булева променлива bit == 1

от Chervenkov (412 точки)


0
Като намериш кой е 3 бит, например чрез това (от лекциите):
int p = 3;
int n = 35;
int mask = 1 << p; i
nt nAndMask = n & mask;
int bit = nAndMask >> p;
Console.WriteLine(bit);
Това принтира цяло число 0 или 1 и според мен този резултат трябва да се принтира False или True.

от echata (0 точки)


0
Решението ти е ясно но е изцяло с побитови оператори, а в условието е написано друго.

от stoyanov (2483 точки)


1
Въпроса наистина е добър, задачата е зададена странно. От една страна се решава без проблем с побитови оператори:
int number = 42; int mask = 1 << 3; int numberAndMask = number & mask; int bit = numberAndMask >> 3;
Console.WriteLine(bit);
но от друга защо се иска булев израз. Може разбира се и някакво такова решение да се даде:
int number = 42; string binary = Convert.ToString(number, 2); char bit; bit = binary[binary.Length - 4];
Console.WriteLine(bit == "0" ? 0 : 1);
Тук вече има булев израз.

от stamopetkov (1429 точки)


0
Точно това ми дойде първо на ум като прочетох няколко пъти условието, но реших да попитам за да не стават грешки - понеже решението на echata, ако правилно разбирам условието е напълно грешно но от друга страна е напълно вярно с оглед на това че в заданието се говори за битове и ни беше казано на лекцията че се набляга на побитовите оператори на изпита и че те са важни - може пък да има грешка в условието!

от stoyanov (2483 точки)


5
Ето и най-безумния вариант, но пък 100% отговаря на условието:
int number = 42; Console.WriteLine(((number >> 3) & 1) == 1 ? 1 : 0);
За да е по ясно:
1. number = number >> 3;
2. number = number & 1;
3. if (number == 1) {write 1} else {write 0}

от stamopetkov (1429 точки)


0
Поправка :) принципно оператора ? : е ненужен. Достатъчно е да напишем ((number >> 3) & 1) тъй като това ще върне 0 или 1, но пък в този случай отново няма булев оператор

от stamopetkov (1429 точки)


0
Ето и цялото решение :) според мен
http://pastebin.com/Ab6r0eNr

от stamopetkov (1429 точки)


0

Логично е да се очаква използване на побитови операции, тъй като те се привързват към хардуерно реализираните операции изпълнявани от процесорът и поради това се очаква тези операции да са по-бързи като реализация?!


от kiril.ilarionov (1482 точки)


2

Ето го и моето решение... използвам 8 за маска (както е указано в учебника)... не съм слагала проверка за инт... мисля че на този етап не е нужно (поне в задачите от изпита изрично пише да не се прави проверка на входа):

http://pastebin.com/t0WkPheR


от anonymous (0 точки)


0
Супер, мисля, че това решение е ОК, само дето използването на 8 за маска е прекалено частен случай :) аз мисля, че е по добре да се ползва 1 след съответното изместване (така би работило винаги, а не само за 3ти бит)

от stamopetkov (1429 точки)

0
Винаги разбира се може да ползваш за маска 2 на степен бита който ти е необходим и пак е универсално :) т.е. 2 на степен 3 = 8

от stamopetkov (1429 точки)


0
Здравейте, някой може ли да даде някакъв хинт за последните две задачи от същото това домашно?Благодаря предварително.

от ccnikolova (0 точки)


0
има си теми за тях

от Nedko (1220 точки)


1
http://pastebin.com/7NVQGNMR ами аз си го направих, както ни го показаха на лекциите :)

от mariq88 (232 точки)


0

Според мен се използват побитови операции, както е описано от колегите, и след като намериш дали битът е 1 или 0, дефинираш булева променлива:
bool isBit3One = ( bit==0 ? true : false );
Според правилата за имената bool обикновено започва с is или has, или пък isNot / hasNot.
След това принтираш например:
Console.WriteLine("Bit 3 of {0} is 1: {1}", n, isBit3One);




0
Тернарният условен оператор ? : не е добра практика.

от Mahata231 (1351 точки)

0
Може ли да обясниш защо, предварително благодаря.

от stoyanov (2483 точки)