tounsignedstring 방법 의 해석
정수에는 int를 서명되지 않은 유형 문자열로 변환하는 메소드가 있음을 알았지 만 그다지 명확하지 않은 몇 가지 점이 있습니다. 정보를 쿼리 한 후 다음과 같이 이해합니다.
/*** 정수를 서명되지 않은 번호로 변환합니다. */ 개인 정적 문자열 tounsignedString (int i, int shift) {char [] buf = new char [32]; int charpos = 32; int radix = 1 << shift; int mask = radix -1; do {buf [-charpos] = 숫자 [i & mask]; i >>> = 시프트; } while (i! = 0); 새 문자열을 반환합니다 (buf, charpos, (32 -charpos)); }여기서 파라미터 이동은 이진 시스템을 나타냅니다. 이진 인 경우, 시프트는 2이고, 옥탈은 8이고, 해당 마스크는 1 및 7로 계산됩니다. 마스크를 통해 숫자 배열에서 해당 문자를 연속적으로 추출합니다.
이런 식으로, 나는 매번 논리적 인 오른쪽 편이 작업을 수행하고, 가장 높은 비트는 0을 더해서 연속적인 논리적 오른쪽 편이 후에 0이 될 것입니다.
또한 Do- while을 채택하는 것은 BUF 배열이 0 일 때 값을 얻지 못하게하는 것입니다.
토스트 링 방법 의 해석
//이 배열은 숫자의 10 자리 부분을 나타내며이 배열은 아래에서 사용됩니다. 최종 정적 char [] digittens = { '0', '0', '0', '0', '0', '0', '0', '0', '0', '0', '1', '1', '1', '1', '1', '1', '1', '1', '1', '2', '2', '2', '2', '2', '2', '2' '2', '2', '2', '2', '3', '3', '3', 3 ','3 ','3 ','3 ','3 ','3 ','3 ','3 ','3 ','4 ','4 ','4 ','4 ','4 ','4 ','4 ','4 ','4 ','5 ','5 ',', ',', '5', '5' '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '5', '6', '6', ',', ','6 ','6 ','6 ','5 ','5 ','5 ','5 ','5 ','5 ','5 ' '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '6', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7' '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7', '7' '7', '7', '8', '8', '9', '9', '9', '9', '9', '9', '9', '9', '9', '9', '9',}; //이 배열은 숫자의 단일 자리 부분을 나타내며이 배열은 아래에 사용됩니다. 배열의 각 부분이 결합되면 100 내의 모든 경우에서 2 자리 정수를 얻을 수 있습니다. 최종 정적 숯 [] 1 ','2 ','3 ','4 ','5 ','5 ','6 ','7 ','8 ','9 ','0 ','1 ','2 ',' ','4 ',', ',', ',', ',', ',', ',', ',', ',', ','4 ','7 ','7 ','7 ','7 ','7 ' '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', ''1 ','2 ','4 ',', ',', ',', ',', ',', ','4 ' '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '2', ',', ',', ',', ',', ',', ',', '2' '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '7', '7', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '', '1', ',', ',', ',', ',', ',', ',', '1' '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '5', '6', '7', '8', '9', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '9',}; public static string tostring (int i) {if (i == integer.min_value) // 여기에 1을 추가하십시오. 처음에는 그것이 무엇을 의미하는지 모르겠습니다. 나중에 음수가 발견되면 앞에 음수 부호를 추가해야하므로 문자열의 크기를 추가해야합니다. stringsize (-i) + 1 : stringsize (i); char [] buf = new char [size]; getchars (i, size, buf); 새 문자열을 반환합니다 (0, size, buf); } static void getchars (int i, int index, char [] buf) {int q, r; int charpos = index; 숯 사인 = 0; if (i <0) {sign = '-'; i = -i; } // 65536을 초과하는 정수의 경우 먼저 다음 프로세스를 수행하십시오. //이 프로세스에서 100 단위로, 나머지는 두 자리 숫자로 제어됩니다. 이것은 의심 할 여지없이 각 숫자를 찾는 것보다 훨씬 빠릅니다. (i> = 65536) {q = i / 100; // 실제로 : r = i- (q * 100); r = i- ((q << 6) + (q << 5) + (q << 2)); i = q; buf [-Charpos] = Digitones [r]; buf [-Charpos] = Digittens [r]; } // 더 작은 숫자의 빠른 모드로 넘어 가면 // assert (i <= 65536, i); // 65536보다 적은 정수의 경우 다음 부분은 직접 수행 할 수 있으며이 장소는 10으로 직접 나뉘어져 있지 않지만, 구현은 대신 52429/2^19를 찾으십시오. // 어쩌면 부정확 한 다음 제수에 10을 곱하여 10 자리 이상의 수를 얻으려면 // 부품을 얻을 수 있습니다. 이 부분에서 10 자리 이상의 숫자로 (;;) {q = (i * 52429) >>> (16+3)에 대한 단일 자릿수 수를 얻습니다. r = i- ((q << 3) + (q << 1)); // r = i- (q*10) ... buf [-Charpos] = 숫자 [r]; i = q; if (i == 0) 파손; } if (sign! = 0) {buf [-Charpos] = 부호; }} 최종 정적 int [] sizetable = {9, 99, 999, 9999, 99999, 999999, 99999, 999999, 999999, 9999999, integer.max_value}; // 이것은 여기서 최적화되어야하며 정수 데이터의 비트는 Sizetable //, 1 ~ 10 비트 : 2147483647, // Sizetable을 통해 저장됩니다. }고사로 의 해석
public static int highestonebit (int i) {// hd, 그림 3-1 i | = (i >> 1); i | = (i >> 2); i | = (i >> 4); i | = (i >> 8); i | = (i >> 16); 반환 i- (i >>> 1); }이 방법은 매우 흥미 롭습니다. 나는 그 본질을 이해하기 전에 직접 계산했습니다. 이 방법의 기능은 가장 큰 정수로 표시되는 정수의 값을 찾는 것입니다. 이 기능은 변위를 통해 여기서 실현됩니다. 간단한 예를 들어 봅시다. 128의 경우 바이너리는 1000 0000입니다. 예를 들어 봅시다.
1 자리를 이동하십시오
1000 0000
0100 0000
| -----------
2 자리를 움직입니다
1100 0000
0011 0000
| ------------
4 비트를 움직입니다
1111 0000
0000 1111
| ------------
8 비트를 움직입니다
1111 1111
0000 0000
| ------------
모바일 16 비트
1111 1111
0000 0000
| ------------
1111 1111
최종 결과는 당신이 볼 수있는 것입니다. 다음 비트는 모두 1으로 채워지고 다음 비트는 모두 가장 높은 비트로 정수를 나타 내기 위해 차감됩니다.
BitCount 방법 분석
public static int bitcount (int i) {// hd, 그림 5-2 I = i- ((i >>> 1) & 0x55555555); i = (i & 0x3333333) + ((i >>> 2) & 0x33333333); i = (i + (i >>> 4)) & 0x0f0f0f0f0f0f; i = i + (i >>> 8); i = i + (i >>> 16); 반환 i & 0x3f; } 이 방법은 오랫동안 공부하는 데 오랫동안 쓸모가 없었으며 나중에 나는 대략적인 아이디어를 알아 냈습니다.
첫 번째 줄에서 구현은 정수 유형의 이진 비트를 2와 2로 그룹화 한 다음 두 비트 중 1 개를 계산하는 것입니다. 이 공식이 어떻게 생겼는지 모르겠지만 실제로는 그렇습니다.
두 번째 줄은 정수의 4 및 4 바이너리 비트 그룹을 구현 한 다음 세그먼트 내에서 시프트 첨가를 계산합니다 (1001-> 10 + 01 = 11). 세 번째 줄은 정수의 8 개의 이진 비트를 그룹화 한 다음 위의 방법과 유사한 변위를 추가하는 것입니다. 물론 이것은 특정 교대와 운영을 통해 달성됩니다.
다음은 16 개의 그룹과 32 개의 그룹이며, 마지막으로 통계를 마지막 몇 자리로 표시된 통계로 통합합니다.
위는이 기사의 모든 내용입니다. 모든 사람의 학습에 도움이되기를 바랍니다. 모든 사람이 wulin.com을 더 지원하기를 바랍니다.