» »

[C#] Operacija IN in ALI med dvema int številoma

[C#] Operacija IN in ALI med dvema int številoma

Cvenemir ::

Lep pozdrav.

Zanima me, kako se v programskem jeziku c# izvede operacija IN in ALI nad dvema številoma tipa int.

Hvala.

darkolord ::

1 | 5 // ali
1 & 3 // in

Cvenemir ::

Implementirajte tudi glavni podprogram, s katerim boste oba izdelana podprograma preizkusili: uporabnik naj vnese dve binarni števili, glavni podprogram pa naj izpiše v dvojiškem sestavu njuno vsoto in razliko ter rezultata dvojiških operacij IN in ALI med obema številoma.

Takšna so navodila. Zdej me pa zanima še če lahko IN in ALI izvedem nad števili v int obliki in nato samo pretvorim v binarno obliko, ali je potrebno izdelati postopek za operacijo IN ALI nad binarnimi števili?

gendale ::

ti prebereš string (recimo "011101")
to pretvoriš v int (recimo Convert.ToInt32(tvojString,2);)
nad intom delaš vse potrebne operacije
pretvoriš nazaj v binarni string (recimo Convert.ToString(tvojInt, 2);)
seznam zanč moderatorjev in razlogov da so zanč
http://pastebin.com/QiWny5dV
gor je mavrik apple uporabniček (mali možgani in mali penis)

Cvenemir ::

Program zdaj pravilno deluje. Edini problem je še izpis. Če vpišem recimo 001 in 100 mi izpiše samo vsoto in operacijo ALI....če vpisujem daljša števila pa izpiše vse 4 operacije. Mogoče negativnih ne izpiše? In zakaj ne izpiše operacije IN med 1 in 4?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Delo_z_binarnimi_števili
{
    class Program
    {
        // Funkcija za pretvorbo iz destiške v binarno obliko
        static string decToBin(long vhodnoStevilo)
        {
            string rezultat = "";

            // Nadaljuj dokler vhodno stevilo ni enako nic
            while (vhodnoStevilo > 0)
            {
                // Rezultatu dodamo spredaj 0 ali 1, odvisno od ostanka
                rezultat = (vhodnoStevilo % 2) + rezultat;
                // Vhodno stevilo delimo z 2 in nadaljujemo
                vhodnoStevilo /= 2;
            }

            return rezultat;
        }
      
        // Funkcija za pretvorbo iz binarne v desetiško obliko
        static long binToDec(string vhodniNiz)
        {
            long rezultat = 0;

            // Zanka skozi binarni niz, zacnemo na levi strani
            for (int i = 0; i < vhodniNiz.Length; ++i)
                // Rezultatu vsakic pristejemo binarno vrednost (0 ali 1), množeno z 2 na potenco,
                // ki je enaka (vhodniNiz.Length - 1) - i
                rezultat += long.Parse(vhodniNiz[i].ToString()) * (long)Math.Pow(2, vhodniNiz.Length - 1 - i);

            return rezultat;
        }

        //Glavni program, s katerim preverimo delovanje funkcij
        static void Main(string[] args)
        {           
                       
            //Branje vhodnih nizov in pretvorba v int
            Console.Write("Vnesite prvo število v binarni obliki: ");
            string vhodniNizBinarni1 = Console.ReadLine();   
            long stevilo1 = binToDec(vhodniNizBinarni1);

            Console.Write("Vnesite drugo število v binarni obliki: ");
            string vhodniNizBinarni2 = Console.ReadLine();
            long stevilo2 = binToDec(vhodniNizBinarni2);

            //Računanje vsote, razlike , operacije IN in operacije ALI
            //long vsotaStevil = stevilo1 + stevilo2;
            //long razlikaStevil = stevilo1 - stevilo2;
            //long operacijaIN = stevilo1 & stevilo2;
            //long operacijaALI = stevilo1 | stevilo2;

            //Računanje, pretvorba in izpis
            long vsotaStevil = stevilo1 + stevilo2;
            string vsotaStevilBin = decToBin(vsotaStevil);
            Console.WriteLine("Vsota podanih števil je: {0} ", vsotaStevilBin);

            long razlikaStevil = stevilo1 - stevilo2;
            string razlikaStevilBin = decToBin(razlikaStevil);
            Console.WriteLine("Razlika podanih števil je: {0}", razlikaStevilBin);

            long operacijaIN = stevilo1 & stevilo2;
            string operacijaINx = decToBin(operacijaIN);
            Console.WriteLine("Rezultat operacije IN je: {0}", operacijaINx);

            long operacijaALI = stevilo1 | stevilo2;
            string operacijaALIy = decToBin(operacijaALI);
            Console.WriteLine("Rezultat operacije ALI je: {0}", operacijaALIy);

            // Pritisni katerokoli tipko za izhod
            Console.ReadKey();
        }
    }
}

Qcube ::

100 & 001 == 0. Ne izpisuje ti 0 in negativnih števil.

LeQuack ::

Res je. V operacijo decToBin bi lahko na začetek dodal še tole:
            if (vhodnoStevilo == 0)
                return "0";


Za prikazovanje negativnih števil binarno pa je bolj zoprno, ker obstaja več notacij, tako da bi to že moralo biti definirano v nalogi.
Quack !

Cvenemir ::

Hvala za nasvet. Kako pa bi v funkciji binToDec preveril če je vhodni podatek pravilen? Se pravi, če je sestavljen iz ničel in enk.

Poskusil sem takole, ampak ker je vhod tipa string ne morem uporabiti primerjave !=. kljub temu mi izpiše napako tolikokrat, kolikokrat gre zanka skozi.

for (int i = 0; i < vhodniNiz.Length; ++i)
            {
                if (vhodniNiz[i] != "0" && vhodniNiz[i] != "1") break;              
                {
                    // Rezultatu vsakic pristejemo binarno vrednost (0 ali 1), množeno z 2 na potenco,
                    // ki je enaka (vhodniNiz.Length - 1) - i
                    rezultat += long.Parse(vhodniNiz[i].ToString()) * (long)Math.Pow(2, vhodniNiz.Length - 1 - i);
                }
            }
            Console.WriteLine("Vhodni podatek je napačen.");                    
            return rezultat;            

Qcube ::

Spremeni "0" v '0' in "1" v '1', bi moralo delat.

LeQuack ::

Qcube ima prav, char se določi samo z enojnim narekovajem.

        // Funkcija za pretvorbo iz binarne v desetiško obliko
        static long binToDec(string vhodniNiz)
        {
            long rezultat = 0;
 
            // Zanka skozi binarni niz, zacnemo na levi strani
            for (int i = 0; i < vhodniNiz.Length; ++i)
            {
                // Binarni niz ne vsebuje samo 0 in 1, izpisi napako in zapri program
                if (vhodniNiz[i] != '0' && vhodniNiz[i] != '1')
                {
                    Console.WriteLine("Vhodni podatek je napačen.");

                    // Pritisni katerokoli tipko za izhod
                    Console.ReadKey();
                    Environment.Exit(0);
                }
                else
                    // Rezultatu vsakic pristejemo binarno vrednost (0 ali 1), množeno z 2 na potenco,
                    // ki je enaka (vhodniNiz.Length - 1) - i
                    rezultat += long.Parse(vhodniNiz[i].ToString()) * (long)Math.Pow(2, vhodniNiz.Length - 1 - i);
            }
 
            return rezultat;
        }
Quack !

Cvenemir ::

Hvala za pomoč. Sem popravil. Edino kar ne štima je še to, da operacija IN baje ne deluje kot bi morala nad števili tipa long. Bi bilo vredu zamenjati vse long z byte? :)

LeQuack ::

Ne vem zakaj ne bi delala operacija IN, vsaj kolikor sem jaz testiral dela normalno. Lahko pa poizkusiš s tipom int, če ne rabiš delati z zelo velikimi števili.
Quack !


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

C# program za pretvorbo v desetiško število z rekurzijo

Oddelek: Programiranje
81371 (1094) MrStein
»

Kalkulator

Oddelek: Programiranje
111228 (995) lebdim
»

Nemorem rešit ene naloge z c++ (sem začetnik) (strani: 1 2 )

Oddelek: Programiranje
6810020 (5758) technolog
»

[c#] Optional parameters must appear....

Oddelek: Programiranje
6714 (621) lambda
»

[C#] Input string was not in a correct format.

Oddelek: Programiranje
6966 (903) Cvenemir

Več podobnih tem