Visualizzazione dei risultati da 1 a 3 su 3

Discussione: [Java] Shift di bit

  1. #1
    Utente di HTML.it L'avatar di Gipple
    Registrato dal
    Mar 2009
    Messaggi
    41

    [Java] Shift di bit

    Salve a tutti. Avevo una domanda forse stupida ... allora, sostanzialmente, mi stavo dedicando ad esercizio didattico (per un ragazzo a cui sto dando una mano) in Java che però non ne vuole sapere di funzionare a dovere. Sostanzialmente il testo diceva di creare una classe bit e una classe byte (composta OBBLIGATORIAMENTE da un array di 8 oggetti di tipo bit) e successivamente di svolgere alcune operazioni su di esso. Tutto funziona a parte il metodo che dovrebbe fare lo shift (non essendo specificato quale, ho ipotizzato fosse lo shift destro senza segno) ma il tutto mi aggiunge uno zero in più e non riesco a capire perchè ... qualcuno mi può dare una mano?
    L'oggetto bit è definito semplicemente con una variabile booleana e i metodi per settare a 1 o a 0 la variabile, mentre l'ggetto byte e la funzione incriminata sono definiti in questo modo:

    codice:
    public class Byte
    {
    	public Bit[] Byte;
    	
    	public Byte()
    	{
    		Byte = new Bit[8];
    		//Inizializzo tutti i bit a 0 (il costruttore di Bit lo setta a 0 se non sono passati argomenti alla creazione) per testare un'altra funzione che ho omesso
    		for (int i = 0; i < 8; i++)
    		{Byte[i] = new Bit();}
    	}
    	
    		public void shift() 
    	{
    	//Faccio un ciclo a ritroso per spostare tutti i valori di un posto, a parte l'ultimo che va perso
    		for (int i = 6; i >= 0; i--)
    		{
    			this.Byte[i + 1] = this.Byte[i];
    		}
    	//Imposto a zero il primo bit 
    		this.Byte[0].ReSet(); 
    	}
    }
    Grazie in anticipo, ciao!

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    L'errore è nel richiamare il metodo ReSet(), ma è concettuale: quando tu "copi" il valore di una cella in un altra, stai semplicemente facendo puntare la cella allo stesso oggetto che prima era puntato dalla precedente... ergo, alla fine del ciclo le celle [0] e [1] fanno riferimento allo stesso identico oggetto. Se tu azzeri uno dei due, la modifica viene riflessa anche dall'altro. Quello che devi fare tu è creare un nuovo oggetto e assegnarlo alla cella [0]:

    codice:
    this.Byte[0] = new Bit();
    PS: visto che stai cercando di aiutare un ragazzo, cerca anche di insegnarli le "buone maniere":

    1) I nomi delle variabili e dei metodi devono iniziare con la lettera minuscola, solo i nomi delle classi (e delle interfacce e costanti) iniziano con la maiuscola (quindi, Byte può andare bene come nome di classe, non come nome di variabile (tra l'altro, della classe che si chiama nello stesso identico modo!); il metodo della classe Bit dovrebbe chiamarsi "reSet()", con la "r" minuscola).

    2) Dato che non puoi chiamare una variabile "byte", chiamala in un altro modo.

    3) Essendo che Byte è il nome di una classe del core standard di Java (e proprio di java.lang), cambierei i nomi delle classi in qualcosa che faccia capire che si tratta di una classe "custom", evitando così di mandare in confusione chi non è pratico con le collisioni.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di Gipple
    Registrato dal
    Mar 2009
    Messaggi
    41
    Originariamente inviato da LeleFT
    L'errore è nel richiamare il metodo ReSet(), ma è concettuale: quando tu "copi" il valore di una cella in un altra, stai semplicemente facendo puntare la cella allo stesso oggetto che prima era puntato dalla precedente... ergo, alla fine del ciclo le celle [0] e [1] fanno riferimento allo stesso identico oggetto. Se tu azzeri uno dei due, la modifica viene riflessa anche dall'altro. Quello che devi fare tu è creare un nuovo oggetto e assegnarlo alla cella [0]:

    codice:
    this.Byte[0] = new Bit();
    Uhhh grazie mille, non avevo assolutamente pensato a questa cosa, ma effettivamente ha senso

    Originariamente inviato da LeleFT
    PS: visto che stai cercando di aiutare un ragazzo, cerca anche di insegnarli le "buone maniere":
    Eh lo so Gli ho accennato alla convenzione qualche tempo fa, ma mi è stato detto che la professoressa di norma le scrive così ... tralasciando che secondo me dovrebbe insegnare pure quella, se va bene a lei va bene anche a me (tra l'altro, non so se era una mania del mio professore ... ma lui ci disse di scrivere i nomi dei metodi in inglese mentre loro li scrivono tutti in italiano )
    Ammetto però che non avevo minimamente pensato al fatto che esistesse anche una classe core byte, o meglio, lo sapevo ma non ci ho minimamente pensato
    Grazie ancora!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.