javascript 32-बिट अहस्ताक्षरित बिट्स पर बिटवाइज़ संचालन?




bit-manipulation (3)

बिटकॉइन संचालन करने से पहले जावास्क्रिप्ट ऑपरेट्स को 32-बिट हस्ताक्षरित इनट में परिवर्तित करता है। यह 32-बिट हस्ताक्षरित इनट्स के साथ ऑपरेशन भी करता है, जिसका अर्थ है कि परिणाम 32-बिट हस्ताक्षरित इंट है।

क्योंकि मैं 32-बिट अहस्ताक्षरित इन-बिट्स के साथ बिटवाइज़ ऑपरेशंस करना चाहता हूं, मैं सोच रहा हूं कि क्या इच्छित परिणाम का पता लगाने के लिए जावास्क्रिप्ट का उपयोग करने का एक तरीका है।

मेरे विचार को प्रदर्शित करने के लिए, उदाहरण के लिए, C में, जो कि जैसा मैं चाहता हूं, उसका संदर्भ है,

unsigned int a = 3774191835u;
unsigned int b = a >> 2;
/* b == 943547958 */

जावास्क्रिप्ट में,

 var a = 3774191835;
 var b = a >> 2;
 /* b == -130193866 */

आइए इसे एक अलग ऑपरेशन के साथ आज़माएं। सी में,

unsigned int a = 1986735448u;
unsigned int b = a << 1;
/* b == 3973470896 */

जावास्क्रिप्ट में,

 var a = 1986735448;
 var b = a << 1;
 /* b == -321496400 */

अब जब जावास्क्रिप्ट ने एक हस्ताक्षरित इंट के रूप में ऑपरेंड के साथ मेरे बिटवाइज़ ऑपरेशन का मूल्यांकन किया है, तो निश्चित रूप से, हम सी में क्या करेंगे, इसके लिए एक अलग परिणाम प्राप्त करते हैं, जहां हम अहस्ताक्षरित इन्ट्स पर बिटवाइज़ ऑपरेशन कर सकते हैं।

मुझे पता है कि यह संभव है, लेकिन मैं इस तरह से अनिश्चित हूं कि मैं अनिवार्य रूप से जावास्क्रिप्ट के परिणाम को इच्छित परिणाम में बदल सकता हूं।

शून्य-भरण अधिकार शून्य परिणाम द्वारा केवल दूसरे मामले के लिए शिफ्ट करता है, लेकिन पहले नहीं।

 var a = 3774191835;
 var b = (a >> 2) >>> 0;
 /* b == 4164773430 */

 var a = 1986735448;
 var b = (a << 1) >>> 0;
 /* b == 3973470896 */

आपको केवल इन नियमों का पालन करना है:

  1. हमेशा >>> 0 साथ थोड़ा सा बुद्धिमान ऑप्सन करें ताकि परिणाम को अहस्ताक्षरित समझा जा सके।
  2. उपयोग न करें >> यदि बायां-सबसे थोड़ा 1 है, तो यह संकेत को चुभाने की कोशिश करेगा और इस तरह बाईं ओर 1 को लागू करेगा। हमेशा >>> उपयोग करें।

उदाहरण:

C:  (3774191835 >> 2) | 2147483648
js: (3774191835 >>> 2 | 2147483648) >>> 0

C:  1986735448 << 1
js: (1986735448 << 1) >>> 0

C:  3774191835 & 4294967295
js: (3774191835 & 4294967295) >>> 0

केवल तभी यदि अंतिम ऑप >>> , >>> 0 आवश्यक नहीं है।


जावास्क्रिप्ट दो बिट शिफ्ट ऑपरेटरों, >> और >>> की पेशकश करके इस समस्या का ख्याल रखता है। आप चाहते हैं कि >>> साइन बिट को शिफ्ट किए बिना एक शिफ्ट करें।


यह बदसूरत है, लेकिन:

var a = 1986735448;
var b = (a << 1) >>> 0;
/* b = 3973470896 */






bit-manipulation