unsigned short w Javie

Jak mogę zadeklarować wartość unsigned short w Javie?

Author: Thomas Clemensen, 2009-12-03

14 answers

Nie możesz, naprawdę. Java nie ma żadnych niepodpisanych typów danych, z wyjątkiem char.

Wprawdzie Ty mógłbyś użyć char - jest to 16-bitowy, niepodpisany Typ - ale moim zdaniem byłoby to straszne, ponieważ char jest wyraźnie przeznaczone do tekstu: gdy kod używa char, spodziewam się, że będzie go używać do jednostek kodu UTF-16 reprezentujących interesujący program tekst, a nie dowolne, niepodpisane 16-bitowe liczby całkowite bez związku z tekstem.

 59
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-09-05 15:58:33

Jeśli naprawdę potrzebujesz wartości z dokładnie 16 bitami:

Rozwiązanie 1: Użyj dostępnego skrótu signed i przestań martwić się o znak, chyba że musisz zrobić porównanie (, >=) lub operacje podziału ( / ,%,>>). Zobacz ta ODPOWIEDŹ, aby dowiedzieć się, jak obsługiwać podpisane liczby, tak jakby były niepodpisane.

Rozwiązanie 2 (gdzie rozwiązanie 1 nie ma zastosowania): Użyj niższych 16 bitów int i usuń wyższe bity z & 0xffff, jeśli to konieczne.

 12
Author: starblue,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 10:31:24

To jest naprawdę nieświeży wątek, ale z korzyścią dla każdego, kto przyjdzie po. Znak jest typem liczbowym. Obsługuje wszystkie operatory matematyczne, operacje bitowe itp. To niepodpisana 16.

Przetwarzamy sygnały rejestrowane przez Niestandardowy sprzęt wbudowany, więc Obsługujemy wiele niepodpisanych 16 Z A-D. używamy znaków wszędzie od lat i nigdy nie mieliśmy żadnych problemów.

 10
Author: joel garringer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-05-17 15:01:43

Można użyć znaku, ponieważ jest to niepodpisana 16-bitowa wartość (choć technicznie jest to znak unicode, więc może potnetycznie zmienić się na wartość 24-bitową w przyszłości)... inną alternatywą jest użycie int i upewnienie się, że znajduje się w zasięgu.

Don ' t use a char-use an int: -)

A tu link omawiający Javę i brak niepodpisanego .

 9
Author: TofuBeer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-03 17:19:44

No such type in java

 3
Author: paweloque,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-03 17:18:42

Z 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);
}
 2
Author: mobiusinversion,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-20 20:54:57

Tak nie ma czegoś takiego, jeśli chcesz użyć wartości w kodzie a operacjach bitowych.

 1
Author: Jé Queue,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-03 17:19:15
 1
Author: RoboLam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-02-13 00:02:59

Nie, naprawdę nie ma takiej metody, java jest językiem wysokiego poziomu. Dlatego Java nie ma żadnych niepodpisanych typów danych.

 1
Author: muhammad Ahmad,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-08 10:40:42

Powiedział, że chce stworzyć wielowymiarową krótką tablicę. Jednak nikt nie sugerował operatorów bitowych? Z tego, co czytałem, chcesz użyć 16 bitowych liczb całkowitych nad 32 bitowymi liczbami całkowitymi, aby zapisać pamięć?

Więc po pierwsze, aby rozpocząć 10,000 x 10,000 krótkie wartości to 1,600,000,000 bitów, 200,000,000 bajtów, 200,000 kilobajtów, 200 megabajtów.

Jeśli potrzebujesz czegoś o zużyciu 200MB pamięci, możesz chcieć przeprojektować ten pomysł. Nie wierzę również, że nawet skompilować nie mówiąc już uruchomić. Ty nigdy nie powinien inicjować dużych tablic, jak to, jeśli cokolwiek wykorzystuje 2 funkcje wywoływane na żądanie ładowania i buforowania danych. Zasadniczo ładowanie na żądanie odnosi się do idei ładowania danych tylko w razie potrzeby. Następnie buforowanie danych robi to samo, ale wykorzystuje niestandardową pracę ramki do usuwania starej pamięci i dodawania nowych informacji w razie potrzeby. Ten jest trudny do uzyskania dobrej wydajności prędkości. Są inne rzeczy, które możesz zrobić, ale te dwa są moimi ulubionymi, gdy są zrobione dobrze.

/ Align = "left" / to, co mówiłem o operatorach bitowych.

Więc 32-bitowa liczba całkowita lub w Javie "int". Można do tego zapisać tak zwane "bity", więc powiedzmy, że masz 32 wartości logiczne, które w Javie wszystkie wartości zajmują 32 bity (z wyjątkiem długich) lub dla tablic zajmują 8 dla bajtów, 16 dla krótkich i 32 dla int. Więc jeśli nie masz tablic, Nie uzyskujesz żadnych korzyści z użycia bajtu lub skrótu. Nie oznacza to, że nie powinieneś używać go jako sposobu na upewnienie się, że ty i inni znacie zakres danych tej wartości powinienem był.

Teraz, jak mówiłem, możesz skutecznie przechowywać 32 wartości logiczne w jednej liczbie całkowitej, wykonując następujące czynności:

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;

Więc teraz Skrót składa się z 16 bitów, więc 16 + 16 = 32, co idealnie pasuje do 32-bitowej liczby całkowitej. Tak więc każda wartość int może składać się z 2 krótkich wartości.

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

Więc to, co robi powyższe, to wartość między -32768 a 32767 lub jako niepodpisana wartość 0 - 65535. Załóżmy więc, że wartość była równa -1, więc jako wartość niepodpisana była to 65535. To oznaczałoby to, że bity od 1 do 16 są włączone, ale podczas rzeczywistego wykonywania matematyki rozważ zakres 0-15.

Więc musimy aktywować bity 17-32. Więc musimy zacząć od czegoś większego niż 15 bitów. Zaczynamy od 16 bitów. Więc biorąc wartość 2 i mnożąc ją przez 65536, czyli to, co robi "
int assumed_value = 262143;

Więc powiedzmy, że chcemy odzyskać dwa 16-bitowe wartości całkowite.

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

Również zasadniczo myśleć o operatorach bitowych jako potęgach 2. To wszystko, czym naprawdę są. Nigdy nie patrzeć na to terminy 0 i 1. i głównie opublikował to, aby pomóc każdemu, kto może natknąć się na to wyszukiwanie unsigned krótkie lub nawet ewentualnie wielowymiarowych tablic. Jeśli są jakieś literówki, przepraszam, że szybko to napisałem.

 0
Author: Jeremy Trifilo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-03 16:16:08

Jeśli istnieje opcja korzystania z biblioteki innej firmy, istnieje jOOU (spin off biblioteki z jOOQ ), która oferuje typy wrapperów dla niepodpisanych liczb całkowitych w Javie. To nie jest dokładnie to samo, co posiadanie prymitywnej obsługi typu (a więc kodu bajtowego) dla typów niepodpisanych, ale być może nadal jest wystarczająco dobre dla Twojego przypadku użycia.

import static org.joou.Unsigned.*;

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

(Zastrzeżenie: pracuję dla firmy stojącej za tymi bibliotekami)

 0
Author: Lukas Eder,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-12-15 10:28:42

Java nie ma typów niepodpisanych. Po co ci to?

Java ma jednak typ danych 'byte'.

 -1
Author: CBFraser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-03 17:19:11

Możesz zakodować sobie klasę ShortUnsigned i zdefiniować metody dla tych operatorów, które chcesz. Nie będziesz w stanie przeciążać + i - i innych znajdujących się na nich, ani nie będziesz miał konwersji typu implicit z innymi prymitywnymi lub numerycznymi typami obiektów, niestety.

Podobnie jak niektóre inne odpowiedzi, zastanawiam się, dlaczego masz tę pilną potrzebę unsigned short, że żaden inny typ danych nie wypełni.

 -1
Author: Carl Smotricz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-12-03 17:56:10

Prosty program do pokazania, dlaczego potrzebne są niepodpisane liczby:

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);
    }
}

Wyniki:

0xC568 0xFFFFE2B4 0xFFFFF15A 0xFFFFF8AD 0xFFFFFC56

Teraz dla tych, które nie są typami systemu:

JAVA wykonuje przesunięcie arytmetyczne, ponieważ operand jest podpisany, jednak są przypadki, w których logiczne przesunięcie byłoby odpowiednie, ale JAVA (w szczególności Sun), uważa to za niepotrzebne, szkoda dla nas na ich krótkowzroczność. Shift, and, Or I Exclusive Or są narzędziami ograniczonymi, gdy wszystkie masz podpisane dłuższe numery. To jest szczególny problem podczas łączenia się z urządzeniami sprzętowymi, które mówią "prawdziwymi" bitami komputerowymi, które są 16 bitami lub więcej. "char" nie jest gwarantowany (ma teraz szerokość dwóch bajtów), ale w kilku wschodnich językach opartych na gif, takich jak chiński, koreański i japoński, wymagają co najmniej 3 bajtów. Nie znam potrzeb numerycznych języków w stylu sandscript. Liczba bajtów nie zależy od programisty, a od Komitetu standards committee for JAVA. Tak więc opierając znak jako 16 bitów ma ryzyko. Aby bezpiecznie zaimplementować unsigned shorts JAVA, jako że Klasa specjalna jest najlepszym rozwiązaniem opartym na wyżej wymienionych wieloznacznościach. Minusem klasy jest niemożność przeciążenia operacji matematycznych dla tej specjalnej klasy. Wielu autorów tego wątku dokładnie wskazało na te problemy, ale mój wkład to przykład kodu roboczego i moje doświadczenie z 3-bajtowymi językami GIF w C++ pod Linuksem.

 -1
Author: Patrick Ireland,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-10-01 21:16:32