Loading...
Valleri avatar Valleri 304 Точки

We all love bits - моля за пояснение

Стигнах до следното решение: http://pastebin.com/YMuVpZuw

Отговорите не са ми верни, огледах условието, може би от умора не мога да видя...реших направо да питам :)
Поотделно inverse i b дават верни резултати, но по формулата на Митко излиза съвсем друго, също така установих че дава вярно решение ако сложа като Аутпут "b" - toest продукта на следния код:

  1. int b = 0;
  2.                 while (!= 0)
  3.                 {
  4.                     b = b << 1;
  5.                     b = b | (& 1);
  6.                     p = p >> 1;
  7.                 }



    Доколкото разбирам от условието целта не е само да invert числото.
Тагове:
1
Programming Basics
bobiniki avatar bobiniki 18 Точки

Понеже всяко число XOR-нато с обратното си дава само единици(Пример: 1001 ^ 0110 = 1111), а всяко число AND-нато с 1 дава същото число няма нужда от тези операции.

4
Dekameron avatar Dekameron 481 Точки

Здравей, ако искаш можеш да разгледаш моето решение на задачата :)

Обяснил съм решението в тази тема.

Успех!

5
dim4o avatar dim4o 288 Точки

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

1
ViValDam avatar ViValDam 15 Точки

Побитовите операции, от много страшни, стават много прости, като чатне човек, че те всъщност са само 3 !

Едната е вкарване на 1 в бит  намиращ се в битовета на дадено число , на дадена позиция .

Другата е вкарване на 0 в бит намиращ се в битовета на дадено число , на дадена позиция .

При това няма абсолютно никакво значение, каква стойност в този момент съдържа бита , 0 или 1 все тая !

Все по един и същи начин се вкарва в него новата му стойност.

Ако, искаш пък чак толкова да знаеш, каква стойност се крие бита в момента , идва под ръка трета

(и последна) битова операция - разконспириране на битаsmile - намиране на стойността,която е записана в него - дали е 0 или 1.

 Формули :

Вкарване на 0 или 1 бит 

За това ни е достатътчно да знаеме числото ,в образуването на което този бит участва 

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

 

Формулка за вкарване на 1 в бит :

mask = pos<<1;

newNumber  = number | mask// result - new number

Като заместим едното в другато получаваме , кратката формулка:

newNumber = number | (pos<<1);

 

Формулка за вкарване на 0 в битна дадена позиция в дадено число:

mask = pos<<1;

newNumber = ~mask<<1 & number; // result - new number

Като заместим получаваме краткото записване:

newNumber = ( ~(maskpos<<1) & number

 

Формулка за откриване на стойността на бит , в дадено число ,на дадена позиция от двоичното представяне на числото:

mask = poss<<1;

newNumber = mask & number;

valueInTheBit = newNumber>>pos; // result 1 or 0

или като заместим едно в друго :

valueInTheBit = (mask&number)>>pos;

 

Шифт на английски значи премести,  съответно местим числото 1 на дясно >> и на ляво <<

Пример за шифт:

(5<< 1) >>3  = 00000100

Първо 0000 0001 местим наляво на 5 позиции  и получаваме 0010 0000  и после  преместваме надясно на 3 позиции и получаваме => 00000100 

2
dim4o avatar dim4o 288 Точки

Моето решение без побитовки: тук.

3
Valleri avatar Valleri 304 Точки

Ахааа :) Ясно, уверих се че е така, но това че няма нужда от тези операции не означава ли че крайния отговор на моя код трябва да е верен?

0
Gerry.M avatar Gerry.M 17 Точки

Моето решение(може би поради факта, че го правя в 5 сутринта :D ) е смесено! Има от всичко по малко :)

 

http://pastebin.com/RnA5iQvu

0
ViValDam avatar ViValDam 15 Точки

int n = int.Parse(Console.ReadLine());

for (int i = 0; i < n; i++)
{
int p = int.Parse(Console.ReadLine());
int pNew = 0;
while (p > 0)
{
//logicaly multiply bit in position 0 of p with 1
int bit0 = p & 1;
// shift pNew 1 position left
pNew = pNew << 1;
//logical sum pnew with bit in pos 0 of p
pNew = pNew | bit0;

// shift p 1 position right
p = p >> 1;

}
Console.WriteLine(pNew);

}

1
ViValDam avatar ViValDam 15 Точки
Защото: p ^ (~p) = 1 and 1 & P̈ = P̈ => Pnew = (P ^ P̃) & P̈ = P̈
1
iliev72 avatar iliev72 147 Точки

Тази задача я има във видето на Наков за подготовка подробно обяснена защо някои неща няма нужда да се правят.

В тази задача Наков демонстрира точно това на което се опитва да ни учи - да мислим.

Първо мисли , а после решавай и пиш код.С мислене може да си спестиш писане на излишен код.

1
ViValDam avatar ViValDam 15 Точки

Че, то без мислене и един ред не можеш да напишеш , освен ако го прекопираш от някъде .

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