문제

IP 주소 정보를 처리하는 페이지에서 작업하고 있지만 정수가 서명된다는 사실에 질식하고 있습니다. 나는 비트 연산자를 사용하여 속도를 높이고 있지만 64 번째 비트 (서명/부호없는 플래그)가 엉망입니다.

JavaScript에서 숫자를 서명하지 않도록하는 방법이 있습니까? 서브넷이 30보다 크거나 2 미만이 될 때까지 잘 작동하는 것 같습니다.

이 시도:

<html>
<body>

<script type='text/javascript'>
document.write( (1 << 30) +"<br/>");
document.write( (1 << 31) +"<br/>");
document.write( (1 << 32) +"<br/>");
</script>

</body>
</html>

결과:

1073741824 -2147483648 1

도움이 되었습니까?

해결책

document.write( (1 << 31) +"<br/>");

그만큼 << 연산자는 서명 된 32 비트 정수 (이중 프레임 플로트의 기본 번호 저장에서 변환) 작업으로 정의됩니다. 그래서 1<<31 음수로 이어져야합니다.

서명되지 않은 32 비트 정수를 사용하여 작동하는 유일한 JavaScript 연산자는 다음과 같습니다. >>>. 다른 비트 연산자와 함께 일한 서명 된 지수로 변환하기 위해 이것을 악용 할 수 있습니다.

document.write(( (1<<31)>>>0 )+'<br />');

한편:

document.write( (1 << 32) +"<br/>");

모든 시프트 작업은 가장 낮은 5 비트의 Shift (JavaScript 및 기타 C와 같은 언어로도) 만 사용하기 때문에 작동하지 않습니다. <<32 와 동등하다 <<0, 즉. 변경 없음.

다른 팁

>>>를 사용하여 >>를 사용하여 서명되지 않은 오른쪽 변속을 얻으려면 표시가 확장됩니다. 다른 모든 비트 연산자는 INT가 서명되었는지 여부에 관계없이 동일한 방식으로 행동합니다.

"서브넷이 2 미만인 경우"코드 중단이 발생합니다. 정수의 서명과 관련이없는 버그가있을 수 있습니다.

Douglas Crockford는 Bitwise 운영자가 JavaScript의 나쁜 부분 중 하나라고 생각합니다.

Java에서는 Bitwise 연산자가 정수와 함께 작동합니다. JavaScript에는 정수가 없습니다. 이중 정밀 부동 소수점 숫자 만 있습니다. 따라서 Bitwise 운영자는 숫자 오페라를 정수로 변환하여 사업을 수행 한 다음 다시 변환합니다. 대부분의 언어에서 이러한 연산자는 하드웨어에 매우 가깝고 매우 빠릅니다. JavaScript에서는 하드웨어와는 거리가 멀고 매우 느립니다. JavaScript는 비트 조작을 수행하는 데 거의 사용되지 않습니다.

- "JavaScript : Good Parts"의 Douglas Crockford, 부록 B, Bitwise 연산자 (강조 추가)

Bitwise 운영자가 실제로 논리 속도를 높이고 있다고 확신합니까?

JavaScript에는 정수가 없으며 모든 숫자는 실제로 복식입니다.

그만큼 JavaScript 1.5 Mozilla의 참조 32 비트 숫자에 대해서만 비트 서비스를 안전하게 사용할 수 있다고 제안합니다.

다음은 JavaScript의 서명되지 않은 정수로 IPv4 주소를 변환하는 두 가지 기능입니다.

function ip2long(ip) {
    var ipl=0;
    ip.split('.').forEach(function( octet ) {
        ipl<<=8;
        ipl+=parseInt(octet);
    });
    return(ipl >>>0);
}

function long2ip (ipl) {
    return ( (ipl>>>24) +'.' +
        (ipl>>16 & 255) +'.' +
        (ipl>>8 & 255) +'.' +
        (ipl & 255) );
}

어떤 종류의 IP 주소가 있습니까? IPv4는 32 비트 주소 만 사용하므로 JavaScript는 괜찮습니다 (Double을 사용하면 52 비트 정수 부품). IPv6은 128 비트 주소를 사용하므로 배열을 사용해야합니다. 내 생각에 다른 것이 깨 졌다는 것입니다.

편집] 내부 데이터 유형으로 두 개의 INT 배열을 사용하는 작은 라이브러리를 빌드하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top