[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
Ако искаш обратна връзка, ще те помоля да пейстнеш условието на задачата, не ми се рови из презентациите.

от staafl (5770 точки)


0

Правилно е, колега. Единствено не разбирам защо представяш числата като 7-битови с това .PadLeft(7, '0'), един байт има 8 бита а един int - 32. Също тези Convert.ToString(... , 2).PadLeft(..., '0') комбинации могат да се окрасивят малко:


    // вместо
    
    Console.WriteLine(Convert.ToString((~(1 << p)), 2).PadLeft(7, '0'));
    Console.WriteLine(Convert.ToString(n, 2).PadLeft(7, '0'));
    Console.WriteLine(Convert.ToString(n, 2).PadLeft(7, '0'));
    ...
    
    // една функцийка
    
    static string Pretty(int number) {
        return number.ToString(2).PadLeft(8, '0');
    }
    
    Console.WriteLine(Pretty(~(1 << p)));
    Console.WriteLine(Pretty(n));
    Console.WriteLine(Pretty(n));
    ...


от staafl (5770 точки)


0
Избора на битове го направих произволно да е число което обхваща всички 0 и 1 -ци на числото. Ще го променя да е 8 наистина ,защото със 7 няма много логика. Благодаря Колега за забележката

от m.kostadinov (90 точки)

0
даже и това може да се спести, защото според заданието числата се дават в десетичен вид и отговора също се вади така. Не е изрично указано да се представя двоичния еквивалент на променливите (баси уж е професионално, но се чуствам гадно :) няма ли да дадеш малко повече сладолед на някое готино момиче?! :D

от redOne (0 точки)


4

Ами решенито си работи, но е хубаво да имаш няколко неща в предвид.

При четене на числа от конзолата иzполвай Parse. (http://stackoverflow.com/questions/199470/whats-the-main-difference-between-int-parse-and-convert-toint32).

Съшо така кода може да е малко по-четлив. Защото идеята е при такива лесни задачи просто с един поглед, без да се задълбавам да разбера по какъв начин я решаваш. За целта може да използваш и някоя друга променлива, коментари и най-вече pastebin, защото тук е ад да се четат решения. :D

Иначе плюсче за старанието! Решението ти е правилно! :)

Поздрави,

Стоян

Едит: Моето решение http://pastebin.com/MdPzDLHD :)

Едит 2: Имаш едни излишин къдрави скоби. Понеже нямаш namespace първата и последната са ненужни. :)


от kirov (4821 точки)


0
Здравей колега, гледам че декларираш и въвеждаш променливата "v", но като че ли не я използваш по-нататък :).

от georgi.s.yankov (6219 точки)

0
Да, дава идентичен резултат без значение дали v е 0 или 1..

от Bozho Bekriev (0 точки)



1

Ето и моето решение незнам дали е много вярно.. надявам се ако съм объркал нещо да го посочите

 

 

using System;
 
class Program
{
    static void Main()
    {
        int n, v, p;
        Console.WriteLine("input number: ");
        n = int.Parse(Console.ReadLine());
        Console.WriteLine("set value ( 0 or 1) : ");
        v = int.Parse(Console.ReadLine());
        Console.WriteLine("set bit position:  ");
        p = int.Parse(Console.ReadLine());
        int modifiedN = n | (v << p);
        Console.WriteLine("The new value of {0} , with {1} bit set at {2} position is: {3}",n,v,p,modifiedN);
        Console.WriteLine("\t"+n+" --->  "+modifiedN);
    }
}
 

от iwitass (3695 точки)


0
iwitass, при v=1 работи много елегантно, но при при v=о ( n=8, v=0, p=3), програмата връща пак 1 на мястото на третия бит. Можеби ако се прилага & когато v=0 и | при v=1, ще се получи..или не :\

от Bozho Bekriev (0 точки)


0
Ето едно решение и от мен : http://pastebin.com/M8ZrM5Mk

от Gunslinga (55 точки)


1
Здравейте, ето и моето решение (на този адрес) http://msdn.microsoft.com/en-us/library/a1sway8w%28v=vs.80%29.aspx се вижда, че брой позиции за преместване трябва да бъде винаги int, т.е., икономията с byte освен че е дребна, не става въобще :-)): Edit: Pastebin
http://pastebin.com/dzSB8LBb

от ellapt (6303 точки)


3
Ето го и моето.
using System; class ChangeBits { static void Main() { int number, pos, value; while (true) { Console.WriteLine("Please enter a bit position with positive number:"); bool posBool = int.TryParse(Console.ReadLine(), out pos); Console.WriteLine("Please enter a number:"); bool numberBool = int.TryParse(Console.ReadLine(), out number); Console.WriteLine("Please enter a value 1 or 0 to change bit:"); bool valueBool = int.TryParse(Console.ReadLine(), out value); if (pos>0 && valueBool && numberBool && posBool && (value == 0 || value == 1)) { if (value == 0) { int result = (~(1 << pos) & number); Console.WriteLine("The result is {0} or decimal {1}", Convert.ToString(result,2).PadLeft(32,'0'),result); } else { int result2 = ((1 << pos) | number); Console.WriteLine("The result is {0} or decimal {1}",Convert.ToString(result2,2).PadLeft(32,'0'),result2); } } } } }

от Gerya (1079 точки)


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

от ellapt (6303 точки)

0
да ще го сложа мерси:)

от Gerya (1079 точки)


1

 

using System;
 
class Program
{
    static void Main()
    {
        var n = 5; // 00000101
        var v = 0; // 1 or 0
        var p = 2; // position
 
        // Get the bit at the position p
        int mask = 1 << p;
        int nAndMask = n & mask;
        int bit = nAndMask >> p;
       
        if (bit != v && bit == 0) 
        {
            int result = n | mask;
            Console.WriteLine(result);  
        }
        if (bit != v && bit == 1)
        {
            int mask2 = ~(1 << p);
            int result = n & mask2;
            Console.WriteLine(result);  
        }
        if (bit == v)
        {
            Console.WriteLine(n);
        }
 
 
    }
}
 
Ето го и моето решение. Работи! 
Въпроса ми е трябва ли да ме пита за стойности Console.ReadLine защото не сме го учили на този етап ии аз не ги правя така?

от Ivaylo (696 точки)


3

и моето:

static void Main()

{

    Console.WriteLine("Number? ");

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

    Console.WriteLine("Position?");

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

    Console.WriteLine("Digit, that you want?(1 or 0)");

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

    int digit = (((1 << p) & n) >> p);

    if (digit == v) Console.WriteLine("The digit is already set at {0}", v);

    else if (digit == 0) n = (n | (1 << p));

    else if (digit == 1) n = ((~(1 << p) & n));

    Console.WriteLine(n);

 }




0
Реших задачата като написах функция SetBitPToV която да ползва решенията на предишните две задачи от побитови операции.

Като че ли се получи стегнат и лесно разбираем код?

Ето го и решението ми:

/* setBitP.cs 21-Oct-2012 k.ilarionov@gmail.com * 12. 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 setBitP { public static int maskaBitP(int p) { // maskaBitP = (int) Math.Pow(2, p); int mask;// my Mask to check bitP mask = 2; // Pow(2, 1) if (0 == p) mask = 1; else if (p > 1) mask = mask << p - 1; // Pow(2, p) return (mask); }
public static bool isZeroBitP(int p, int num) { return (0 == (num & maskaBitP(p))); }
public static int getBitP(int p, int num) { int result; if (isZeroBitP(p, num)) result = 0; else result = 1; return (result); }
public static int SetBitPToV(int p /* Possition*/, int v /* new bit Value */, int num) { int result; if (v == getBitP(p, num)) result = num; // не променяме Битове else // p != v result = num ^ maskaBitP(p) ; // инвертираме само p-ия бит return (result); }
static void Main() { int n = 5, p = 3, v = 1, result; result = SetBitPToV(p, v, n); Console.WriteLine("n = {3} ({4}), p={1}, v={2} -> {0} ({5})", result, p, v, n, Convert.ToString(n, 2), Convert.ToString(result, 2)); result = SetBitPToV(2, 0, n); Console.WriteLine("n = {3} ({4}), p={1}, v={2} -> {0} ({5})", result, 2, 0, n, Convert.ToString(n, 2), Convert.ToString(result, 2)); result = SetBitPToV(2, 1, n); Console.WriteLine("n = {3} ({4}), p={1}, v={2} -> {0} ({5})", result, 2, 1, n, Convert.ToString(n, 2), Convert.ToString(result, 2)); result = SetBitPToV(1, 0, 5); Console.WriteLine("n = {3} ({4}), p={1}, v={2} -> {0} ({5})", result, 1, 0, n, Convert.ToString(n, 2), Convert.ToString(result, 2)); result = SetBitPToV(5, 0, n); Console.WriteLine("n = {3} ({4}), p={1}, v={2} -> {0} ({5})", result, 5, 0, n, Convert.ToString(n, 2), Convert.ToString(result, 2)); } }

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