JS 는 32 비트 가 넘 는 정수 의 비트 연산 을 어떻게 처리 합 니까?

이 문 제 는 이미 졸업 한 학생 이 가가 가 물 어 본 것 이다. 인터넷 에서 그 에 게 답 을 찾 아 보 는 것 이 편리 하 다 고 생각 했다. 다시 생각해 보 니 인터넷 에서 그 가 인터넷 에서 알 아 볼 수 있 는 방안 이 나 에 게 물 어 볼 정 도 는 아니 었 을 것 이다. 차라리 스스로 풀 어 주 었 으 면 좋 겠 다. 이 문 제 는 좀 재 미 있 는 것 같 기 때문이다.
우선, 왜 이 문제 가 문제 가 되 었 는 지 알 아야 한다. 여기 서 JS 에서 아버지의 비트 연산 규칙 을 말 해 야 한다.
우 리 는 JS 가 약 한 유형의 스 크 립 트 언어 라 는 것 을 알 고 있 습 니 다. 모든 수 치 는 정수 든 소수 든 사실은 64 비트 의 부동 소수점 형식 으로 저장 되 어 있 습 니 다. 그러나 두 정수 가 비트 연산 을 할 때 32 비트 의 기호 정수 로 자동 으로 바 뀌 어 이 알 이 아 픈 문 제 를 야기 합 니 다.
이 문 제 를 해결 하기 전에 우 리 는 먼저 이런 일 을 고려 해 보 겠 습 니 다. 만약 당신 앞 에 물 한 항아리 가 있다 면, 당신 은 32L 의 통 만 있 습 니 다. 지금 당신 은 50L 의 물 을 찾 으 려 고 하 는데, 어떻게 찾 으 려 고 합 니까? 두 번 뛰 어 다 니 는 것 이 맞 습 니까?두 번 은 안 되 고 세 번 은 괜 찮 겠 지? 컴퓨터 는 인 류 를 위해 봉사 하 는 것 이 니 이런 생각 은 반드시 통할 수 있 을 것 이다.
예 를 들 어 지금 엄 청 난 숫자 가 있 습 니 다. 우 리 는 그것 이 0xf ff ff ff 라 고 가정 합 니 다. 9 개의 F 가 충분 합 니 다. 32 위 를 넘 으 면 됩 니 다. 만약 에 우리 가 이 숫자 를 가지 고 0xf 000 f 와 다 르 거나 우리 가 원 하 는 결 과 는 0x f 0 fff fff fff 0 맞 습 니까?그러나 이상 은 매우 풍만 하고 현실 은 잔혹 하 다. 왜냐하면 당신 이 이 두 개의 숫자 를 직접 가 져 간 후에 결 과 는 0x 0 fff fff fff 0 이라는 것 을 발 견 했 기 때문이다. 왜냐하면 32 비트 의 정수 로 바 뀌 었 을 때 그 기준 치 를 초과 한 수의 높 은 바이트 부분 이 잘 렸 기 때문이다. 아버지?
내 가 방금 말 한 차례 의 원 리 를 돌 이 켜 보면 JS 가 매번 최대 32 비트 의 비트 연산 만 처리 할 수 있 는 이상 단락 을 나 누 어 처리 할 수 있 습 니까?분명히 말 해 줄 게, 괜찮아.
그렇다면 다음 문 제 는 1, 몇 단락, 어떻게 2 로 나 누 는 지, 분 리 된 데 이 터 는 어떻게 처리 하 는 지, 3 으로 나 누 어 처리 한 데 이 터 는 어떻게 통합 하 는 지 하 는 것 이다.
위의 데 이 터 를 결합 하여 분석 하면 0xf ff ff ff 의 총 효과 적 인 데 이 터 는 실제 적 으로 뒤의 9 개의 바이트 에 만 존재 하고 JS 의 비트 연산 은 최대 4 개의 바이트 의 데 이 터 를 처리 할 수 있 으 며 한 바이트 만 추출 하여 단독으로 처리 하고 나머지 부분 은 다른 단락 으로 처리 하면 된다.
브 라 우 저 에 문제 가 있 습 니 다. 저장 하면 무 너 지고 코드 를 잃 어 버 립 니 다.
var longN = 0xfffffffff;  //   
var shortN = 0x0ffffff0;  //   
var tool = 0x000000ff;   //        (     )      

var t_long = longN & tool;    //           
var t_short = shortN & tool;  //           
var t_r = t_long ^ t_short;  //            
var offset = Math.pow(2,tool.toString(16).length * 4);
longN =  Math.floor(longN / offset); //              ,    32            
//!!!  ,      parseInt,    64   32 
shortN = Math.floor(shortN / offset);  //  
var t_h = longN ^ shortN;    //               
t_h *= offset;               //             
var result = t_h + t_r       //    
console.log(result.toString(16));   //ff000000f

위의 코드 는 하나의 예 일 뿐 하나의 사고 방향 을 나타 내 는 것 이지 만 아직 완전한 건장 한 해결 방안 이 아니다. 더 많은 수의 위 에 이것 은 실현 할 수 없 는 것 이 고 32 의 수 는 기호 가 있 기 때문에 두 단락 으로 나 누 어 처리 할 때 그 중의 한 단락 은 최대 31 자리 에 불과 하 다.그래서 가장 확실한 방법 은 두 조작 수 중 길이 가 가장 큰 데이터 에 따라 유연 하 게 나 누 는 것 이다. todo...

좋은 웹페이지 즐겨찾기