Kalkulator bitowy java

0

Cześć :)

Mam problem z napisaniem dość prostego programu, a mianowicie kalkulatora bitowego.
Jego treść to: W poniższym nagłówku metody dostarczono, dwie tablice zmiennych typu char, znakoperacji, oraz zmienną int:
public static void calc(char[ ]number1,char[ ]number2,char operator,←↩int system) ;
Tablice te zawierają ciągi cyfr (o dowolnej długości) opisujące liczby całkowite dodatnie w systemie dziesiątkowym.
Natomiast operator określa operację jaką należy wykonać.
Zaimplementuj program realizujący kalkulator dodawania i odejmowania,
w którym wszystkie operacje programistyczne zostaną zrealizowane przy pomocy operatorów bitowych
a wynik zostanie wyświetlony na ekranie w postaci ciągu cyfr w systemie określonym przez zmienną system.
Dla ułatwienia przyjmij, że wartość ta to liczba całkowita w przedziale 2 do 16.
Czy naprowadziłby mnie ktoś jak się do tego zabrać?

Z góry dziękuję :)

1
jaszczur512 napisał(a):

Czy naprowadziłby mnie ktoś jak się do tego zabrać?

Są tu trzy osobne problemy:

  • implementacja dodawania i odejmowania dla liczb nieograniczonej wielkości
  • implementacja dodawania i odejmowania za pomocą operatorów bitowych
  • konwersja liczby z char[] dziesiętnie do postaci na której można operować i z powrotem do postaci char[] ale o podstawie od 2 do 16

Z którą częścią masz problem? Co już napisałeś?

0

Jeszcze nic sensownego, bo nie do końca wiem jak się za to zabrać.
Próbowałem wykorzystać operatory bitowe, ale nic nie wyszło.

0

Dodawanie i odejmowanie robisz jak w szkole. Dodajesz dwie cyfry, jeśli wyjdzie liczba większa niż 9 to przenosisz jedynkę do kolejnego rządku.

Nie wiem, co by tu miały robić operacje bitowe (chyba że masz to przekonwertować do ciągu intów). Natomiast jeśli chcesz to potem skonwertować do wybranego systemu to potrzebujesz jeszcze zaimplementować dzielenie z resztą. Z tego co pamiętam to dość niewdzięczne zadanie.

0

To chyba nie ma sensu kompletnie?

public static void main(String[ ]args) {

    public static void calc(char[ ]number1,char[ ]number2,char operator,←↩int system);

    int number1= x;
    int number2 = y;

    System.out.println("Podaj x");
    System.out.println("Podaj y");

    if (x+y >2 & x+y<16);
    System.out.println("Wynik:");
    else (x-y >2 & x-y<16);
    System.out.println("Wynik:");
0

Trzymaj szablon który działa ale używa operacji których nie wolno ci pewnie użyć:

import java.math.BigInteger;

public class WriteOnly {

  public static void main(String[] args){
    System.out.println("WriteOnly.pl");
    calc("456".toCharArray(), "123".toCharArray(), '+', 10);
    calc("456".toCharArray(), "123".toCharArray(), '-', 10);
    calc("456".toCharArray(), "123".toCharArray(), '+', 2);
    calc("456".toCharArray(), "123".toCharArray(), '-', 2);
  }
     
  static void  calc(char[] number1, char[] number2, char operator, int system)  {
    final BigInteger left  = new BigInteger(new String(number1));
    final BigInteger right = new BigInteger(new String(number2));
    final BigInteger result = apply(left, right, operator);
    final String string  = result.toString(system);
    System.out.println(string);
    
  }
   
  static BigInteger apply(BigInteger number1, BigInteger number2, char operator)  {
      switch (operator) {101001101
        case '+' : return number1.add(number2);
        case '-' : return number1.subtract(number2);
        default: throw new IllegalArgumentException("Operator " + operator);
      }
  }
}

Pewnie nie wolno Ci użyć BigInteger. BTW takie zadanie dla kogoś kto nie nie zna składni deklaracji metody, oraz nie umie wczytać znaków jest dziwne. Trochę jakbyś pominą pół roku nauki. Ale nie ważne. Powodzenia

0

Dodałem obie tablic, czy zrobiłem to w dobry sposób?

public static void main(String[ ]args)  {

    public static void calc(char[ ]number1,char[ ]number2);

    char[] number1 = new char[];

    for (char i = 0; i < 16; i++)
        number1[i] = i + 2;

    char zmienna = number1[2];

    for (char i = 0; i < 16; i++);

    System.out.println("number1");

    char[] number2 = new char[];

    for (char i = 0; i < 16; i++)
        number2[i] = i + 2;

    char zmienna = number2[2];

    for (char i = 0; i < 16; i++);

    System.out.println("number2");

    char[] array1and2 = new char[array1.length + array2.length];
    System.arraycopy(array1, 0, array1and2, 0, array1.length);
    System.arraycopy(array2, 0, array1and2, array1.length, array2.length);

Jeśli chodzi o poziom wiedzy, to wielki mętlik. Faktycznie, rozpocząłem naukę od początku, bo zatrzymałem się na tablicach, z których ogarnięciem mam problem.
Dziękuję bardzo za kod :))))))

1

Małe review:

     public static void main(String[ ]args)  {
 
         public static void calc(char[ ]number1,char[ ]number2); //To się nie skompiluje
 
         char[] number1 = new char[]; // nadpisujesz parametr, to się chyba nawet nie skompiluje?
 
         for (char i = 0; i < 16; i++) // a co jak tablica ma inną ilość elementów niż 16?
             number1[i] = i + 2; //co to według ciebie ma robić?
 
         char zmienna = number1[2]; // dlaczego akurat 2?
 
         for (char i = 0; i < 16; i++); // to nic nie robi
 
         System.out.println("number1");
 
         char[] number2 = new char[]; // nadpisujesz parametr, to się chyba nawet nie skompiluje?
 
         for (char i = 0; i < 16; i++) // a co jak tablica ma inną ilość elementów niż 16?
             number2[i] = i + 2; //co to według ciebie ma robić?
 
         char zmienna = number2[2]; //dlaczego akurat 2?
 
         for (char i = 0; i < 16; i++); // to nic nie robi
 
         System.out.println("number2");
 
         char[] array1and2 = new char[array1.length + array2.length]; //dodałeś tablice, dosłownie z "10" + "10" dostaniesz "1010" (chyba że gdzieś jest jeszcze błąd) .testowałeś to w ogóle?
         System.arraycopy(array1, 0, array1and2, 0, array1.length);
         System.arraycopy(array2, 0, array1and2, array1.length, array2.length);

Jeśli chodzi o poziom wiedzy, to wielki mętlik

Tak

0

Nie chce się skompilować, wyskakuje "illegal start of expression"

0

Czytasz co ludzie piszą? @KamilAdam dodał Ci komentarze,tłumaczące dlaczego sie nie kompiluje; masz jakieś normalne IDE?

0

Tak, przeczytałem komentarze. A korzystam z intelij

0

Jak przeczytałeś, to chyba wiesz co poprawić.

wszystkie operacje programistyczne zostaną zrealizowane przy pomocy operatorów bitowych

Pokaż, przykład dodawania lub odejmowania operatorami bitowymi.

0

No właśnie nie wiem jak to poprawić.
A jeśli chodzi o przykład dodawania operatorami, to jak dodać dwie tablice? Będzie to przy użyciu znaku " I "?
Jak już wspomniałem, mam problem z ogarnięciem tablic, przez co kompletnie nie wiedziałem jak zabrać się za zadanie.

0

Może to coś pomoże: https://github.com/andrzejlisek/ScriptSDCC/tree/master/script_examples/Num
Jakiś czas temu hobbystycznie opracowałem symulator Z80 i C51 współpracujący z SDCC, więc program można traktować jako skrypt.

Ten projekt posłużył mi do implementacji obliczeń na dowolnie dużych liczbach na mikrokontrolery i tak powstał projekt w katalogu Num. W pliku readme.txt jest skrótowy opis poszczególnych plików.

Co prawda, jest to w języku C, ale myślę, że w Twoim przypadku możesz zrobić w podobny sposób. Jednakże, w tym przypadku wielkość liczb (ile cyfr mieszczą przed i po przecinku) jest znana i ustalana przed kompilacją (poprzez ustawienie kilku makr w pliku numdef.h), podobnie, jak można ustawić użyty typ zmiennej i jego pojemność. Jedna liczba w tym przypadku jest tablicą liczb całkowitych określonego typu i działania wykonuje się na tych tablicach.

Nie powinno być dużym problemem dostosowaniem tego kodu do uruchamiania w C na komputerze. Zacząć trzeba od pliku numcalc.c, w którym trzeba przede wszystkim pozmieniać funkcje wypisujące tekst i pobierające informacje.

0

@jaszczur512:

A jeśli chodzi o przykład dodawania operatorami, to jak dodać dwie tablice? Będzie to przy użyciu znaku " I "?

Właśnie, wydaje mi sie, że żaden operator bitowy nie da Ci tego samego co dodawanie; chyba, że ich kombinacja, ale to już jakies absurdalne przekombinowanie.

0

Czyli będzie to najzwyczajniejsze tab1 + tab2 ?

0

Nie tak jak tutaj:
https://cp-algorithms.com/algebra/big-integer.html
Dodawanie liczb pisemne, jak w szkole, bez znaczenia w jakim zapisane systemie liczbowym.

0
jaszczur512 napisał(a):

Czyli będzie to najzwyczajniejsze tab1 + tab2 ?

Nope. Sumować możesz tylko poszczególnych elementy tablicy. Poza tym, żeby nie było tak łatwo to jest tablica charów, więc '0' będzie miało wartość 48, '1' - 49 itd.

0 użytkowników online, w tym zalogowanych: 0, gości: 0