سؤال

أنا أعمل على صفحة تعالج معلومات عنوان IP، لكنها تختنق على حقيقة أن الأعداد الصحيحة توقيعها. أنا أستخدم مشغلي bitwise لتسريعها، لكن القليل 64 (العلم الموقد / غير الموقعة) يعززه.

هل هناك أي طريقة لإجبار رقم ليكون غير موقعة في جافا سكريبت؟ يبدو أنه يعمل بشكل جيد، حتى يزيد الفرعية عن 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 يجب أن يؤدي إلى رقم سلبي.

المشغل JavaScript الوحيد الذي يعمل باستخدام الأعداد الصحيحة غير الموقعة 32 بت >>>. وبعد يمكنك استغلال هذا لتحويل عدد صحيح تم توقيعه في عدد أكبر من المشغلين Bitwise آخر إلى عدد صحيح غير موقعة:

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

وفى الوقت نفسه:

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

لن تعمل لأن جميع عمليات التحول تستخدم فقط أدنى 5 بت من التحول (في جافا سكريبت ولغات أخرى مثل C أيضا). <<32 يساوي <<0, ، بمعنى آخر. لا تغيير.

نصائح أخرى

استخدم >>> بدلا من >> للحصول على تحول صحيح غير موقعة بدلا من تسجيل الدخول. يتصرف جميع المشغلين Bit هذا بنفس الطريقة بغض النظر عن ما إذا كان يتم توقيع ITS أو لا.

كسر الكود الخاص بك "عندما يكون الفرعية ... أقل من 2" يتعلق. يبدو أن هذا يبدو وكأنه قد يكون لديك بعض علة غير مرتبطة بوقع الأعداد الصحيحة.

Douglas Crockford يعتقد أن مشغلي Bitwise هي واحدة من الأجزاء السيئة من جافا سكريبت:

في جاوة، يعمل مشغلي bitwise مع الأعداد الصحيحة. جافا سكريبت ليس لديها أعداد صحيحة. لديها فقط أرقام نقطة عائمة مزدوجة. لذلك، يقوم مشغلو Bitwise بتحويل عدد المعاملات الخاصة بهم إلى أعداد صحيحة، وقم بعملهم، ثم تحويلها مرة أخرى. في معظم اللغات، فإن هؤلاء المشغلين قريبون جدا من الأجهزة وسريعة للغاية. في جافا سكريبت، فهي بعيدة جدا عن الأجهزة وبطيئة جدا. نادرا ما يستخدم جافا سكريبت في التعامل مع البت.

- دوغلاس كروكفورد في "جافا سكريبت: الأجزاء الجيدة"، الملحق ب، مشغلي bitwise (التركيز المضافة)

هل أنت متأكد من أن مشغلي bitwise يسرعون حقا منطقك؟

لا تملك جافا سكريبت أعداد صحيحة، وجميع الأرقام تتضاعف في الواقع.

ال جافا سكريبت 1.5 مرجع من قبل موزيلا يشير إلى أن المرء لا يمكن إلا أن يستخدم فقط العمليات Bitwise بأمان لعدد 32 بت.

فيما يلي وظيفتان يحولان عناوين 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 على ما يرام (باستخدام المزدوج الذي يمنحك الجزء عدد صحيح 52 بت). يستخدم IPv6 عناوين 128bit، لذلك عليك استخدام صفيف. تخميني هو أن شيئا آخر مكسور.

تحرير] قم ببناء مكتبة صغيرة تستخدم مجموعة من اثنين من دولتين كوعي بيانات داخلي.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top