Domanda

Come posso dichiarare un valore di unsigned short in Java?

È stato utile?

Soluzione

Non è possibile, in realtà. Java non ha nessun tipo di dati senza segno, ad eccezione char.

È vero che si potrebbero uso char - è un tipo senza segno a 16 bit - ma sarebbe orribile a mio avviso, come char è chiaramente destinata ad essere per il testo: quando il codice utilizza char, mi aspetto di essere utilizzato per UTF-16 unità di codice che rappresentano il testo che è interessante il programma, non arbitrari unsigned interi a 16 bit senza rapporto con il testo.

Altri suggerimenti

Se davvero avete bisogno di un valore con esattamente 16 bit:

Soluzione 1: Utilizzare la disposizione firmato breve e smettere di preoccuparsi per il segno, a meno che non si deve fare il confronto (<, <=,>,> =) o divisione (/,%,> >) per le operazioni. Vedi questa risposta per sapere come gestire i numeri con segno come se fossero senza segno.

Soluzione 2 (dove soluzione 1 non si applica). usando i 16 bit inferiori di int e rimuovere i bit superiori con & 0xffff eventualmente

Questa è una discussione molto stantio, ma a beneficio di chi viene dopo. Il char è un tipo numerico. Supporta tutti gli operatori matematici, le operazioni di bit, ecc Si tratta di un unsigned 16.

Noi elaboriamo i segnali registrati da hardware embedded personalizzato in modo da gestire un sacco di unsigned 16 dalla A-D di. Abbiamo utilizzato caratteri in tutto il luogo per anni e non abbiamo mai avuto alcun problema.

È possibile utilizzare un char, in quanto è un valore senza segno a 16 bit (anche se tecnicamente si tratta di un carattere Unicode così potrebbe potnetially cambiamento per essere un valore di 24 bit in futuro) ... l'altra alternativa è quella di utilizzare un int e assicurarsi che sia nel raggio d'azione.

Non utilizzare un char - utilizzare un int: -)

E qui è un collegamento discutendo Java e la mancanza di unsigned .

Da DataInputStream.java

public final int readUnsignedShort() throws IOException {
    int ch1 = in.read();
    int ch2 = in.read();
    if ((ch1 | ch2) < 0)
        throw new EOFException();
    return (ch1 << 8) + (ch2 << 0);
}

No tale tipo in Java

Sì alcuna cosa, se si desidera utilizzare il valore nel codice contro le operazioni di bit.

No, in realtà non v'è tale metodo, Java è un linguaggio di alto livello. Ecco perché Java non ha nessun tipo di dati non firmati.

Ha detto che voleva creare un breve array multi-dimensionale. Eppure nessuno ha suggerito operatori bit per bit? Da quello che ho letto che si desidera utilizzare interi a 16 bit oltre 32 interi bit per risparmiare memoria?

Quindi innanzitutto cominciare 10.000 x 10.000 valori corte è 1,600,000,000 bit, 200.000.000 byte, 200.000 kilobyte, 200 megabyte.

Se avete bisogno di qualcosa con 200MB di consumo di memoria che si potrebbe voler ridisegnare questa idea. Anche io non credo che sarà anche compilare lascia correre da soli. Non si dovrebbe mai inizializzare matrici di grandi dimensioni, come che se qualcosa utilizzano 2 caratteristiche chiamati On Demand Caricamento e caching dei dati. Essenzialmente caricamento a richiesta si riferisce all'idea di caricare i dati solo come è necessario. Poi il caching dei dati fa la stessa cosa, ma utilizza una cornice di lavoro personalizzato per cancellare la memoria vecchi e l'aggiunta di nuove informazioni, se necessario. Questo è difficile da avere prestazioni di velocità BUONA. Ci sono altre cose che si possono fare, ma quei due sono i miei preferiti quando fatto bene.

Va bene tornare a quello che stavo dicendo sugli operatori bit a bit.

Quindi, un numero intero a 32 bit o in Java "int". È possibile memorizzare ciò che sono chiamati "bit" a questo modo diciamo che ha avuto 32 valori booleani, che in Java tutti i valori occupano 32 bit (ad eccezione lunga) o per gli array che occupano 8 per byte, 16 in breve, e 32 per int . Quindi, se non avete le matrici non si ottiene alcun beneficio di memoria da utilizzare un byte o breve. Questo non significa che non si dovrebbe usare come un modo per garantire voi e gli altri conoscono l'intervallo di dati questo valore dovrebbe avere.

Ora, come dicevo si potrebbe effettivamente memorizzare 32 booleane in un singolo intero nel modo seguente:

int many_booleans = -1; //All are true;
int many_booleans = 0; //All are false;
int many_booleans = 1 | 2 | 8; //Bits 1, 2, and 4 are true the rest are false;

Così ora una breve compone di 16 bit così 16 + 16 = 32 che si inserisce perfettamente in un numero intero a 32 bit. Così ogni valore int può essere costituito da 2 valori brevi.

int two_shorts = value | (value2 << 16);

Allora, cosa di cui sopra sta facendo è il valore è qualcosa tra -32768 e 32767 o come valore senza segno 0 - 65535. Quindi diciamo che il valore è pari a -1 in modo come un valore senza segno era 65535. Ciò significherebbe bit da 1 a 16 sono accesi, ma quando in realtà esegue la matematica prendere in considerazione la gamma di 0 - 15.

Quindi abbiamo bisogno di attivare quindi i bit 17 - 32. Quindi dobbiamo cominciare a qualcosa di più grande di 15 bit. Iniziamo dunque a 16 bit. Così prendendo valore2 e moltiplicandolo per 65536 che è ciò che "<< 16" fa. Ora avremmo diciamo valore2 pari a 3 sarebbe in OR = 3x65536 196608. Così il nostro valore intero sarebbe uguale 262.143.

int assumed_value = 262143;

quindi diciamo che vogliamo recuperare i due valori interi a 16 bit.

short value1 = (short)(assumed_value & 0xFFFF); //-1
short value2 = (short)(assumed_value >> 16); //=3

Anche fondamentalmente pensare operatori bit a bit come potenze di 2. Questo è tutto ciò che realmente sono. Non vedere le cose termini di 0 e di 1. Io per lo più postato questo per aiutare tutti coloro che possono venire attraverso questo ricerca per gli array brevi o anche, eventualmente, multi-dimensionale non firmati. Se ci sono mi scuso subito scritto qualsiasi errore di battitura questo in su.

Se si utilizza una libreria di terze parti è un'opzione, non v'è jOOU (uno spin off libreria da jOOQ ), che offre i tipi di wrapper per i numeri interi senza segno in Java. Che non è esattamente la stessa cosa che avere tipo primitivo (e quindi il codice byte) il supporto per i tipi senza segno, ma forse è ancora abbastanza buono per il vostro caso d'uso.

import static org.joou.Unsigned.*;

// and then...
UShort s = ushort(1);

(Disclaimer: io lavoro per l'azienda dietro a queste librerie)

Java non ha tipi senza segno. Cosa ti serve?

Java ha il tipo di dati 'byte', però.

È possibile codificare da soli una classe ShortUnsigned e definire metodi per quegli operatori che si desidera. Non sarà in grado di sovraccaricare + e - e gli altri su di loro, né hanno la conversione di tipo implicita con altri tipi di oggetti primitivi o numerici, ahimè.

Come alcuni degli altri answerers, mi chiedo perché avete questa necessità urgente di unsigned short che nessun altro tipo di dati si riempirà.

Semplice programma per mostrare il motivo per cui sono necessari i numeri senza segno:

package shifttest;
public class ShiftTest{
    public static void main(String[] args){
        short test = -15000;
        System.out.format ("0x%04X 0x%04X 0x%04X 0x%04X 0x%04X\n",
            test, test>>1, test>>2, test>>3, test>>4);
    }
}

Risultati:

0xC568 0xFFFFE2B4 0xFFFFF15A 0xFFFFF8AD 0xFFFFFC56

Ora, per quelli che non sono tipi di sistema:

JAVA fa uno spostamento aritmetico perché l'operando è firmato, tuttavia, ci sono casi in cui un cambiamento di logica sarebbe appropriato, ma Java (Sun in particolare), ha ritenuto necessario, troppo male per noi sulla loro miopia. Shift, And, Or, e OR esclusivo sono strumenti limitati, quando tutto quello che hai è firmato numeri più lunghi. Questo è un problema particolare quando l'interfacciamento con dispositivi hardware che parlano bit per computer "reale" che sono 16 bit o più. "Char" non è garantito il funzionamento (si tratta di due byte di larghezza ora), ma in diverse lingue basate gif orientale, come il cinese, coreano e giapponese, richiedono almeno 3 byte. Io non conosco il numero necessità di lingue stile SandScript. Il numero di byte non dipende programmatore piuttosto la commissione standard per Java. Così basando char come 16 bit ha un rischio valle. Per implementare in modo sicuro pantaloncini non firmato JAVA, come classe speciale è la soluzione migliore in base alle ambiguità di cui sopra. L'aspetto negativo della classe è l'incapacità di sovraccaricare le operazioni matematiche per questa classe speciale. Molti dei collaboratori per questa discussione di rilevare con precisione questi problemi, ma il mio contributo è un esempio di codice di lavoro e la mia esperienza con 3 lingue byte Gif in C ++ in ambiente Linux.

//вот метод для получения аналога unsigned short
    public static int getShortU(byte [] arr, int i )  throws Exception 
    {
       try
       {
           byte [] b = new byte[2]; 
           b[1] = arr[i];
           b[0] = arr[i+1];
           int k = ByteBuffer.wrap(b).getShort();
            //if this: 
           //int k = ((int)b[0] << 8) + ((int)b[1] << 0); 
           //65536 = 2**16
           if ( k <0) k = 65536+ k; 
        return k;
      }  
       catch(Throwable t)
      {
          throw  new Exception ("from getShort: i=" + i);
      }
    }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top