[C#] Operators and Expressions 12 задача


5
Здравейте пращам Ви моето решение на задача 12 от Operators and Expressions.
We are given integer number n, value v (v=0 or 1) and a position p. Write a sequence of operators that modifies n to hold the value v at the position p from the binary representation of n.
Example: n = 5 (00000101), p=3, v=1 à 13 (00001101)
n = 5 (00000101), p=2, v=0 à 1 (00000001)
using System; { class Program { static void Main() { int n, v, p; Console.Write("Please enter a number n="); n = Convert.ToInt32(Console.ReadLine()); Console.WriteLine(Convert.ToString(n, 2).PadLeft(7,'0')); Console.Write("Please eneter a possition p="); p = int.Parse(Console.ReadLine()); Console.Write("Please eneter v="); v = int.Parse(Console.ReadLine()); n = n & (~(1 << p)); Console.WriteLine(Convert.ToString((~(1 << p)), 2).PadLeft(7, '0')); Console.WriteLine(Convert.ToString(n, 2).PadLeft(7, '0')); n = n | (v <<(p)); Console.WriteLine(Convert.ToString(n, 2).PadLeft(7, '0')); Console.WriteLine("{0}",n);
} } }



Отговори



0

Хайде и от мен едно решение, да си призная озори ме докато ми дойде просветлението как да мина логическата проверка как да се промени и кога. Ето го и линка http://pastebin.com/cYE439Yx


от victor.velchev (1225 точки)


0
Колега, смисълът тук според мен е без значение какъв е битът на дадена позиция във въведеното число, просто на някаква позиция, която въвеждаме да сложим бит със стойност, която ние въвеждаме. Или тоест да упражним вмъкването на бит със стойност 1 или бит със стойност 0 на дадена позиция. Иначе задачата ти работи коректно, но разгледай и този вариант, в който не гледаш изобщо във въведеното число какви са битовете. : )

от mbelev (2312 точки)

0
Но аз изваждам какъв е бита в търсената позиция (той е 0 или 1) и после заменям ако трябва.

от victor.velchev (1225 точки)



0
Опс, грешен топик, коментара беше за задача 13.



1
Оставям още един вариант за решение, надявам се лесен за разбиране и бърз за писане:
class ModifyBit { static void Main(string[] args) { int n = 5; // The given integer that we want to modify int p = 3; // The position of the bit we are changing int v = 1; // The value of the changed bit (0 or 1) int checkV = ((1 << p & n) >> p);
if (checkV == v) Console.WriteLine("Nothing to change;\nn = {0}", n); else if (v == 0) Console.WriteLine("Modified n = {0}", n ^ (1 << p)); else if (v == 1) Console.WriteLine("Modified n = {0}", (1 << p) | n); else Console.WriteLine("Wrong Bit value for v;\n Please input 0 or 1"); } }

от K.Mladenov (10 точки)


0
Здравей, използвай pastebin.com или github.com за да си споделяш кода.

от emil.venkov12 (1553 точки)


0

Тук с побитовите оператори става по-интересно, ето и моето решение на задачата, дано да е от полза на някои. : )
https://github.com/Belev/Telerik/blob/master/CSharp1/3.OperatorsExpressionsAndStatements/12.ModifyBitInNumber.cs


от mbelev (2312 точки)


0
Здравейте, ето го и моето решение на задачата.
Забелязях че при въвеждане на v > 1 (стойността на бита за смяна по условие 0 или 1 /то няма какво друго да е де/) също го приема и пресмята резултата с най низшия бит от v, за това приложих If-Else If-Else конструкция. Надявам се да съм бил полезен. Отворен съм за предложения.
Console.Write("n = "); int number = int.Parse(Console.ReadLine()); Console.Write("p = "); int position = int.Parse(Console.ReadLine()); Console.Write("v = "); int value = int.Parse(Console.ReadLine()); int mask = 1; if (value == 1) { mask <<= position; // create the 'mask' moving from 00000001 number |= mask; // apply mask using 'OR' Console.WriteLine("result = " + number); // prints pesult on console } else if (value == 0) { mask <<= position; // create the 'mask' moving from 00000001 number ^= mask; // apply mask using 'XOR' Console.WriteLine("result = " + number); // prints pesult on console } else //this 'else' is for invalid entries { Console.WriteLine("Invalid input for value \"v\"! Must be 0 or 1."); }

от sky_star (0 точки)


0
Хм, има малък проблем със решението което си постнал. Ако искаш да зануляваш стойност ти препоръчвам да ползваш number &= ~(mask). Със xor единственото което постигаш е че обръщаш бита. На теория това звучи все едно върши работа, но това е само така ако на съответната битова позиция вече имаш стойност 1. Понеже вече си заредил 1 в маската, ако му кажеш да xor някой бит които вече си е бил 0, ще го обърне в единица. За пример, ако на твоето решение му дадем: n = 32 p = 0 v = 0 то ни принтира че резултата е 33, което очевидно е грешно.



0

Това е моето решение. Малко ме поизмъчи , но проработи. Това е линк към решението:

http://pastebin.com/F6CBTYiM


от Владимир Миланов (0 точки)


0
Ето го и моето. Има проверка за въведения бит:
http://pastebin.com/wSxsaCWg

EDIT: Кода е препубликуван през http://pastebin.com

от gargantiua (0 точки)


0
ползвай pastebin.com за постване на толкова дълъг код. Прочети правилата! http://forums.academy.telerik.com//15664

от ttitto (1950 точки)