Programing

Java에서 서명되지 않은 짧은

lottogame 2020. 12. 30. 07:36
반응형

Java에서 서명되지 않은 짧은


unsigned shortJava 에서 값을 어떻게 선언 할 수 있습니까?


정말 할 수 없습니다. Java에는 .NET을 제외한 서명되지 않은 데이터 유형이 없습니다 char.

분명히 당신 사용할 있습니다 char-16 비트 unsigned 유형입니다-그러나 그것은 char분명히 텍스트를 의미하는 것처럼 내 견해로 끔찍할 것입니다 . 코드가를 사용할 때 char텍스트를 나타내는 UTF-16 코드 단위에 사용할 것으로 예상합니다. 텍스트와 관계가없는 임의의 부호없는 16 비트 정수가 아니라 프로그램에 흥미 롭습니다.


정확히 16 비트 값이 정말로 필요한 경우 :

해결 방법 1 : 비교 (<, <=,>,> =) 또는 나눗셈 (/, %, >>) 작업을 수행 할 필요가없는 경우 사용 가능한 부호있는 short를 사용하고 부호에 대해 걱정하지 마십시오. 서명 된 숫자를 서명되지 않은 것처럼 처리하는 방법에 대해서는 이 답변참조하십시오 .

솔루션 2 (솔루션 1이 적용되지 않는 경우) : int의 하위 16 비트를 사용하고 필요한 경우 & 0xffff로 상위 비트를 제거합니다.


이것은 정말 오래된 스레드이지만 나중에 오는 사람을 위해. 문자는 숫자 유형입니다. 모든 수학 연산자, 비트 연산 등을 지원합니다. 부호없는 16입니다.

맞춤형 임베디드 하드웨어에 의해 기록 된 신호를 처리하여 A-D에서 서명되지 않은 16 개를 처리합니다. 우리는 수년 동안 곳곳에서 문자를 사용해 왔으며 문제가 없었습니다.


unsigned 16 비트 값이므로 char를 사용할 수 있습니다 (기술적으로는 유니 코드 문자이므로 나중에 24 비트 값으로 변경 될 수 있음) ... 다른 대안은 int를 사용하고 확인하는 것입니다. 범위 내에 있습니다.

문자를 사용하지 마십시오-int를 사용하십시오 :-)

그리고 여기에 Java와 unsigned 부족에 대한 링크있습니다.


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

Java에는 이러한 유형이 없습니다.


코드 대 비트 연산에서 값을 사용하려면 그런 것은 없습니다.


"Java SE 8 이상에서는 int 데이터 유형을 사용하여 최소값이 0이고 최대 값이 232-1 인 부호없는 32 비트 정수를 나타낼 수 있습니다." 그러나 이것은 int 및 long에만 적용되지만 짧지는 않습니다.


아니요, 실제로 그러한 방법은 없습니다. Java는 고급 언어입니다. 이것이 자바에 서명되지 않은 데이터 유형이없는 이유입니다.


그는 다차원적인 짧은 배열을 만들고 싶다고 말했습니다. 그러나 아무도 비트 연산자를 제안하지 않았습니까? 내가 읽은 내용에서 메모리를 절약하기 위해 32 비트 정수보다 16 비트 정수를 사용하고 싶습니까?

따라서 먼저 10,000 x 10,000 short 값을 시작하는 것은 1,600,000,000 비트, 200,000,000 바이트, 200,000 킬로바이트, 200 메가 바이트입니다.

200MB의 메모리를 소비하는 것이 필요하다면이 아이디어를 재 설계하는 것이 좋습니다. 나는 또한 그것이 실행은 고사하고 컴파일 될 것이라고 믿지 않습니다. On Demand Loading 및 Data Caching이라는 두 가지 기능을 활용하는 경우 이와 같은 대형 배열을 초기화해서는 안됩니다. 기본적으로 온 디맨드로드는 필요한 경우에만 데이터를로드하는 아이디어를 의미합니다. 그런 다음 데이터 캐싱은 동일한 작업을 수행하지만 사용자 지정 프레임 작업을 사용하여 이전 메모리를 삭제하고 필요에 따라 새 정보를 추가합니다. 이것은 좋은 속도 성능을 갖는 것이 까다 롭습니다. 당신이 할 수있는 다른 일들이 있지만, 그 두 가지는 제대로 할 때 제가 가장 좋아하는 것입니다.

비트 연산자에 대해 제가 말한 내용으로 돌아갑니다.

따라서 32 비트 정수 또는 Java "int"입니다. 여기에 "비트"라고하는 것을 저장할 수 있으므로 Java에서는 모든 값이 32 비트 (long 제외)를 차지하는 32 개의 부울 값이 있거나 배열의 경우 바이트의 경우 8, 짧게는 16, int의 경우 32를 차지한다고 가정 해 보겠습니다. . 따라서 배열이 없으면 바이트 또는 short를 사용하여 메모리 이점을 얻지 못합니다. 이것은 당신과 다른 사람들이이 값이 가져야하는 데이터 범위를 알도록하는 방법으로 사용해서는 안된다는 것을 의미하지는 않습니다.

이제 내가 말했듯이 다음을 수행하여 32 개의 부울을 단일 정수에 효과적으로 저장할 수 있습니다.

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;

이제 short는 16 비트로 구성되므로 16 + 16 = 32는 32 비트 정수 내에서 완벽하게 맞습니다. 따라서 모든 int 값은 2 개의 짧은 값으로 구성 될 수 있습니다.

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

따라서 위의 작업은 값이 -32768과 32767 사이 또는 부호없는 값 0-65535입니다. 따라서 값이 -1과 같고 부호없는 값이 65535라고 가정 해 보겠습니다. 이것은 비트 1에서 16까지가 켜져 있음을 의미합니다. 그러나 실제로 수학을 수행 할 때는 0-15 범위를 고려하십시오.

그래서 우리는 비트 17-32를 활성화해야합니다. 그래서 우리는 15 비트보다 큰 것에서 시작해야합니다. 그래서 우리는 16 비트에서 시작합니다. 따라서 value2를 취하고 "<< 16"이하는 일인 65536을 곱합니다. 이제 value2가 3이라고 가정하면 OR'd 3x65536 = 196608이됩니다. 따라서 정수 값은 262143과 같습니다.

int assumed_value = 262143;

두 개의 16 비트 정수 값을 검색한다고 가정 해 보겠습니다.

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

또한 기본적으로 비트 연산자를 2의 거듭 제곱으로 생각하십시오. 그게 전부입니다. 0과 1의 용어를 보지 마십시오. 나는 대부분이 서명되지 않은 짧은 배열 또는 다차원 배열을 찾는 사람들을 돕기 위해 이것을 게시했습니다. 오타가 있으면 빨리 적어 죄송합니다.


타사 라이브러리를 사용하는 옵션 인 경우가 jOOU (에서 라이브러리 오프 스핀 jOOQ ), 자바 부호없는 정수 숫자 유형의 래퍼 이벤트. 이것은 서명되지 않은 유형에 대한 기본 유형 (따라서 바이트 코드) 지원을 갖는 것과 똑같은 것은 아니지만 아마도 유스 케이스에는 충분할 것입니다.

import static org.joou.Unsigned.*;

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

(면책 조항 : 저는이 도서관 뒤에있는 회사에서 일합니다)


Java에는 서명되지 않은 유형이 없습니다. 무엇을 위해 필요합니까?

Java does have the 'byte' data type, however.


You can code yourself up a ShortUnsigned class and define methods for those operators you want. You won't be able to overload + and - and the others on them, nor have implicit type conversion with other primitive or numeric object types, alas.

Like some of the other answerers, I wonder why you have this pressing need for unsigned short that no other data type will fill.


Simple program to show why unsigned numbers are needed:

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

results:

0xC568 0xFFFFE2B4 0xFFFFF15A 0xFFFFF8AD 0xFFFFFC56

Now for those that are not system types:

JAVA does an arithmetic shift because the operand is signed, however, there are cases where a logical shift would be appropriate but JAVA (Sun in particular), deemed it unnecessary, too bad for us on their short sightedness. Shift, And, Or, and Exclusive Or are limited tools when all you have are signed longer numbers. This is a particular problem when interfacing to hardware devices that talk "REAL" computer bits that are 16 bits or more. "char" is not guaranteed to work (it is two bytes wide now) but in several eastern gif based languages such as Chinese, Korean, and Japanese, require at least 3 bytes. I am not acquainted with the number need for sandscript style languages. The number of bytes does not depend on the programmer rather the standards committee for JAVA. So basing char as 16 bits has a downstream risk. To safely implement unsigned shorts JAVA, as special class is the best solution based on the aforementioned ambiguities. The downside of the class is the inability of overloading the mathematical operations for this special class. Many of the contributors for this thread of accurately pointed out these issues but my contribution is a working code example and my experience with 3 byte gifs languages in C++ under 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);
      }
    }

ReferenceURL : https://stackoverflow.com/questions/1841461/unsigned-short-in-java

반응형