मैं बाइनरी में पॉजिटिव या निगेटिव देखना चाहूंगा।
बल्कि इस सवाल की तरह , लेकिन जावास्क्रिप्ट के लिए।
मैं बाइनरी में पॉजिटिव या निगेटिव देखना चाहूंगा।
बल्कि इस सवाल की तरह , लेकिन जावास्क्रिप्ट के लिए।
जवाबों:
function dec2bin(dec){
return (dec >>> 0).toString(2);
}
dec2bin(1); // 1
dec2bin(-1); // 11111111111111111111111111111111
dec2bin(256); // 100000000
dec2bin(-256); // 11111111111111111111111100000000
आप Number.toString(2)
फ़ंक्शन का उपयोग कर सकते हैं , लेकिन नकारात्मक संख्याओं का प्रतिनिधित्व करते समय इसमें कुछ समस्याएं हैं। उदाहरण के लिए, (-1).toString(2)
आउटपुट है "-1"
।
इस समस्या को ठीक करने के लिए, आप अहस्ताक्षरित दाईं ओर बिटवाइज़ ऑपरेटर का उपयोग कर सकते हैं (>>>
अपने नंबर को एक अहस्ताक्षरित पूर्णांक में ले जाने के ) का ।
यदि आप चलाते (-1 >>> 0).toString(2)
हैं तो आप अपने नंबर 0 बिट्स को दाईं ओर शिफ्ट कर देंगे, जो नंबर को खुद नहीं बदलता है लेकिन इसे एक अहस्ताक्षरित पूर्णांक के रूप में दर्शाया जाएगा। उपरोक्त कोड "11111111111111111111111111111111"
सही ढंग से आउटपुट करेगा ।
इस सवाल का और स्पष्टीकरण है।
-3 >>> 0
(राइट लॉजिकल शिफ्ट) अहस्ताक्षरित पूर्णांकों के लिए अपने तर्क प्रस्तुत करता है, यही कारण है कि आपको -3 के 32-बिट दो का पूरक प्रतिनिधित्व मिलता है।
प्रयत्न
num.toString(2);
2 मूलांक है और 2 और 36 के बीच कोई भी आधार हो सकता है
स्रोत यहाँ
अपडेट करें:
यह केवल सकारात्मक संख्याओं के लिए काम करेगा, जावास्क्रिप्ट दो-पूरक पूरक में नकारात्मक बाइनरी पूर्णांक का प्रतिनिधित्व करता है। मैंने इस छोटे से कार्य को किया, जो कि चाल को करना चाहिए, मैंने इसे ठीक से जांच नहीं किया है:
function dec2Bin(dec)
{
if(dec >= 0) {
return dec.toString(2);
}
else {
/* Here you could represent the number in 2s compliment but this is not what
JS uses as its not sure how many bits are in your number range. There are
some suggestions /programming/10936600/javascript-decimal-to-binary-64-bit
*/
return (~dec).toString(2);
}
}
मुझे यहां से कुछ मदद मिली थी
-3
रिटर्न 1
) के लिए काम नहीं करता है । इसके अलावा मुझे लगता है कि dec > 0
होना चाहिए dec >= 0
, जो चाहिए कम से कम ठीक 0. पर क्योंकि dec2Bin(0)
रिटर्न 10
।
बाइनरी 'बाइनरी में कन्वर्ट' तीन मुख्य बातों को संदर्भित कर सकता है। स्थितीय संख्या प्रणाली, स्मृति या 32 बिट बिटस्ट्रिंग्स में द्विआधारी प्रतिनिधित्व। (64 बिट बिटस्ट्रिंग के लिए पैट्रिक रॉबर्ट्स का जवाब देखें )
1. संख्या प्रणाली
(123456).toString(2)
संख्याओं को बेस 2 स्थितीय अंकीय प्रणाली में बदल देगा । इस प्रणाली में दशमलव की तरह ऋणात्मक चिन्हों के साथ ऋणात्मक संख्याएँ लिखी जाती हैं।
2. आंतरिक प्रतिनिधित्व
संख्याओं का आंतरिक प्रतिनिधित्व 64 बिट फ्लोटिंग पॉइंट है और इस उत्तर में कुछ सीमाओं पर चर्चा की जाती है । जावास्क्रिप्ट में इस का एक बिट-स्ट्रिंग प्रतिनिधित्व बनाने का कोई आसान तरीका नहीं है और न ही विशिष्ट बिट्स तक पहुंच है।
3. मास्क और बिटवाइज ऑपरेटर
एमडीएन का एक अच्छा अवलोकन है कि बिटवाइज़ ऑपरेटर कैसे काम करते हैं। महत्वपूर्ण बात यह है:
बिटवाइज़ ऑपरेटर अपने ऑपरेंड को 32 बिट्स (शून्य और वाले) के अनुक्रम के रूप में मानते हैं
ऑपरेशन से पहले 64 बिट फ़्लोटिंग पॉइंट संख्या 32 बिट हस्ताक्षरित पूर्णांक पर डाली जाती है। के बाद वे वापस परिवर्तित कर रहे हैं।
यहां 32-बिट स्ट्रिंग्स में संख्याओं को परिवर्तित करने के लिए एमडीएन उदाहरण कोड है।
function createBinaryString (nMask) {
// nMask must be between -2147483648 and 2147483647
for (var nFlag = 0, nShifted = nMask, sMask = ""; nFlag < 32;
nFlag++, sMask += String(nShifted >>> 31), nShifted <<= 1);
return sMask;
}
createBinaryString(0) //-> "00000000000000000000000000000000"
createBinaryString(123) //-> "00000000000000000000000001111011"
createBinaryString(-1) //-> "11111111111111111111111111111111"
createBinaryString(-1123456) //-> "11111111111011101101101110000000"
createBinaryString(0x7fffffff) //-> "01111111111111111111111111111111"
बस एक आसान तरीका है ...
Number(42).toString(2);
// "101010"
(42).toString(2)
42..toString(2)
1.
कि जो जैसा है वैसा ही 1.0
या 1
(और इसी तरह आप पहले वाले हिस्से को भी छोड़ सकते हैं और .5
इसके बजाय लिख सकते हैं 0.5
)। इसलिए उदाहरण में पहला डॉट दशमलव विभाजक है जो संख्या का हिस्सा है और दूसरा डॉट उस नंबर पर विधि को कॉल करने के लिए डॉट ऑपरेटर है। आपको दो डॉट्स का उपयोग करना होगा (या कोष्ठक में संख्या को लपेटना होगा) और केवल 42.toString(2)
इसलिए नहीं लिख सकते क्योंकि पार्सर डॉट को दशमलव विभाजक के रूप में देखता है और एक लापता डॉट ऑपरेटर के कारण त्रुटि फेंकता है।
यह उत्तर 2147483648 10 (2 31 ) - 9007199254740991 10 (2 53 -1) की सीमा में निरपेक्ष मान के साथ इनपुट को संबोधित करने का प्रयास करता है ।
जावास्क्रिप्ट में, संख्या में जमा हो जाती है 64-बिट चल बिन्दु प्रतिनिधित्व है, लेकिन 32-बिट पूर्णांक के लिए बिटवाइज़ संचालन विवश उन्हें में दो के पूरक प्रारूप , इसलिए किसी भी दृष्टिकोण है जो बिटवाइज़ संचालन का उपयोग करता -२१४७४८३६४८ के उत्पादन की सीमा को प्रतिबंधित करता है 10 (-2 31 ) - 2147483647 10 (2 31) -1)।
हालाँकि, अगर बिटवाइज़ ऑपरेशंस से बचा जाता है और केवल गणितीय परिचालनों का उपयोग करके 64-बिट फ़्लोटिंग पॉइंट प्रतिनिधित्व को संरक्षित किया जाता है, तो हम 53-बिट को साइन-अप करके 64-बिट दो के पूरक बाइनरी नोटेशन को किसी भी सुरक्षित पूर्णांक में परिवर्तित कर सकते हैं twosComplement
:
function toBinary (value) {
if (!Number.isSafeInteger(value)) {
throw new TypeError('value must be a safe integer');
}
const negative = value < 0;
const twosComplement = negative ? Number.MAX_SAFE_INTEGER + value + 1 : value;
const signExtend = negative ? '1' : '0';
return twosComplement.toString(2).padStart(53, '0').padStart(64, signExtend);
}
function format (value) {
console.log(value.toString().padStart(64));
console.log(value.toString(2).padStart(64));
console.log(toBinary(value));
}
format(8);
format(-8);
format(2**33-1);
format(-(2**33-1));
format(2**53-1);
format(-(2**53-1));
format(2**52);
format(-(2**52));
format(2**52+1);
format(-(2**52+1));
.as-console-wrapper{max-height:100%!important}
पुराने ब्राउज़रों के लिए, पॉलीफ़िल निम्नलिखित कार्यों और मूल्यों के लिए मौजूद हैं:
एक अतिरिक्त बोनस के रूप में, आप किसी भी मूलांक (2–36) का समर्थन कर सकते हैं यदि आप ( 64 / log 2 (मूलांक) के नकारात्मक अंकों के लिए दो पूरक रूपांतरण का उपयोग करके करते हैं BigInt
:
function toRadix (value, radix) {
if (!Number.isSafeInteger(value)) {
throw new TypeError('value must be a safe integer');
}
const digits = Math.ceil(64 / Math.log2(radix));
const twosComplement = value < 0
? BigInt(radix) ** BigInt(digits) + BigInt(value)
: value;
return twosComplement.toString(radix).padStart(digits, '0');
}
console.log(toRadix(0xcba9876543210, 2));
console.log(toRadix(-0xcba9876543210, 2));
console.log(toRadix(0xcba9876543210, 16));
console.log(toRadix(-0xcba9876543210, 16));
console.log(toRadix(0x1032547698bac, 2));
console.log(toRadix(-0x1032547698bac, 2));
console.log(toRadix(0x1032547698bac, 16));
console.log(toRadix(-0x1032547698bac, 16));
.as-console-wrapper{max-height:100%!important}
यदि आप मेरे पुराने उत्तर में रुचि रखते हैं ArrayBuffer
जो a Float64Array
और a के बीच एक संघ बनाने के लिए उपयोग करते हैं Uint16Array
, तो कृपया इस उत्तर के संशोधन इतिहास को देखें ।
-(2**53)-1
करने के 2**53-1
बजाय काम करता है । -(2**31)
2**31-1
एक समाधान जो मुझे 32-बिट के लिए ठीक है, के साथ जाना होगा, इस उत्तर का कोड है, जो developer.mozilla.org (MDN) से है, लेकिन A (स्वरूपण और B) के लिए जोड़ी गई कुछ पंक्तियों के साथ जाँच कर रहा है कि संख्या सीमा में है।
कुछ ने सुझाव दिया x.toString(2)
कि जो नकारात्मक के लिए काम नहीं करता है, यह सिर्फ उनके लिए वहाँ एक शून्य साइन चिपक जाता है, जो अच्छा नहीं है।
फर्नांडो ने एक सरल समाधान का उल्लेख किया (x>>>0).toString(2);
जो नकारात्मक के लिए ठीक है, लेकिन जब एक्स पॉजिटिव होता है, तो थोड़ा सा मुद्दा होता है। इसमें 1 से शुरू होने वाला आउटपुट है, जो सकारात्मक संख्याओं के लिए उचित 2s पूरक नहीं है।
कोई भी व्यक्ति जो 0 से शुरू होने वाले सकारात्मक संख्याओं के तथ्य को नहीं समझता है और 1s पूरक में 1 के साथ ऋणात्मक संख्याओं को 2 एस पूरक पर इस SO QnA की जांच कर सकता है। "2 का पूरक" क्या है?
एक समाधान में सकारात्मक संख्याओं के लिए 0 को शामिल करना शामिल हो सकता है, जो मैंने इस उत्तर के पहले संशोधन में किया था। और एक कभी-कभी एक 33bit नंबर होने को स्वीकार कर सकता है, या कोई यह सुनिश्चित कर सकता है कि रूपांतरण करने वाली संख्या सीमा के भीतर है - (2 ^ 31) <= x <2 ^ 31-1। तो संख्या हमेशा 32 बिट है। लेकिन ऐसा करने के बजाय, आप इस समाधान के साथ mozilla.org पर जा सकते हैं
पैट्रिक का जवाब और कोड लंबा है और जाहिरा तौर पर 64-बिट के लिए काम करता है, लेकिन एक बग था जो एक टिप्पणीकार को मिला, और टिप्पणीकार ने पैट्रिक की बग को तय किया, लेकिन पैट्रिक के पास अपने कोड में कुछ "मैजिक नंबर" हैं जिनके बारे में उन्होंने टिप्पणी नहीं की है और है के बारे में भूल गया और पेट्रिक अब पूरी तरह से अपने स्वयं के कोड को समझता है / यह क्यों काम करता है।
अन्नान के पास कुछ गलत और अस्पष्ट शब्दावली थी, लेकिन डेवलपर द्वारा एक समाधान का उल्लेख किया गया ।.org https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Outators यह 32-बिट संख्याओं के लिए काम करता है।
कोड बहुत कॉम्पैक्ट है, तीन लाइनों का एक फ़ंक्शन है।
लेकिन मैंने 8 बिट के समूह में आउटपुट को प्रारूपित करने के लिए एक रेगेक्स जोड़ा है। जावास्क्रिप्ट में हजारों विभाजकों के रूप में अल्पविराम के साथ एक संख्या को कैसे प्रिंट करें (मैं इसे 3 एस में दाएं से बाएं में जोड़कर और अल्पविराम जोड़कर , 8 से दाएं से बाएं में समूहीकरण करने और रिक्त स्थान जोड़ने के आधार पर मुद्रित करता हूं )
और, जबकि मोज़िला ने nMask के आकार (में खिलाए गए नंबर) के बारे में एक टिप्पणी की .. कि इसे रेंज में होना है, उन्होंने नंबर के सीमा से बाहर होने पर त्रुटि का परीक्षण नहीं किया या फेंक दिया, इसलिए मैंने कहा कि जोड़ा गया।
मुझे यकीन नहीं है कि उन्होंने अपने पैरामीटर का नाम 'nMask' क्यों रखा, लेकिन मैं इसे छोड़ दूंगा।
संदर्भ: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Bitwise_Operators
function createBinaryString(nMask) {
// nMask must be between -2147483648 and 2147483647
if (nMask > 2**31-1)
throw "number too large. number shouldn't be > 2**31-1"; //added
if (nMask < -1*(2**31))
throw "number too far negative, number shouldn't be < 2**31" //added
for (var nFlag = 0, nShifted = nMask, sMask = ''; nFlag < 32;
nFlag++, sMask += String(nShifted >>> 31), nShifted <<= 1);
sMask=sMask.replace(/\B(?=(.{8})+(?!.))/g, " ") // added
return sMask;
}
console.log(createBinaryString(-1)) // "11111111 11111111 11111111 11111111"
console.log(createBinaryString(1024)) // "00000000 00000000 00000100 00000000"
console.log(createBinaryString(-2)) // "11111111 11111111 11111111 11111110"
console.log(createBinaryString(-1024)) // "11111111 11111111 11111100 00000000"
आप अपना स्वयं का फ़ंक्शन लिख सकते हैं जो बिट्स की एक सरणी देता है। उदाहरण संख्याओं को बिट्स में बदलने का तरीका
उपरोक्त पंक्ति का उदाहरण: २ * ४ = 2 और शेष १ तो ९ = १ ० ० १ है
function numToBit(num){
var number = num
var result = []
while(number >= 1 ){
result.unshift(Math.floor(number%2))
number = number/2
}
return result
}
नीचे से ऊपर तक रीडर्स रखें। अंक 1 मध्य से शीर्ष पर।
Math.floor(number%2)
इसके बजाय क्यों number = Math.floor(number/2)
?
मैंने कुछ ऐसा करने के लिए एक अलग दृष्टिकोण का उपयोग किया जो ऐसा करता है। मैंने अपनी परियोजना में इस कोड का उपयोग नहीं करने का फैसला किया है, लेकिन मुझे लगा कि मैं इसे किसी व्यक्ति के लिए उपयोगी होने की स्थिति में कहीं और छोड़ दूंगा।
function intToBitString(input, size, unsigned) {
if ([8, 16, 32].indexOf(size) == -1) {
throw "invalid params";
}
var min = unsigned ? 0 : - (2 ** size / 2);
var limit = unsigned ? 2 ** size : 2 ** size / 2;
if (!Number.isInteger(input) || input < min || input >= limit) {
throw "out of range or not an int";
}
if (!unsigned) {
input += limit;
}
var binary = input.toString(2).replace(/^-/, '');
return binary.padStart(size, '0');
}
function bitStringToInt(input, size, unsigned) {
if ([8, 16, 32].indexOf(size) == -1) {
throw "invalid params";
}
input = parseInt(input, 2);
if (!unsigned) {
input -= 2 ** size / 2;
}
return input;
}
// EXAMPLES
var res;
console.log("(uint8)10");
res = intToBitString(10, 8, true);
console.log("intToBitString(res, 8, true)");
console.log(res);
console.log("reverse:", bitStringToInt(res, 8, true));
console.log("---");
console.log("(uint8)127");
res = intToBitString(127, 8, true);
console.log("intToBitString(res, 8, true)");
console.log(res);
console.log("reverse:", bitStringToInt(res, 8, true));
console.log("---");
console.log("(int8)127");
res = intToBitString(127, 8, false);
console.log("intToBitString(res, 8, false)");
console.log(res);
console.log("reverse:", bitStringToInt(res, 8, false));
console.log("---");
console.log("(int8)-128");
res = intToBitString(-128, 8, false);
console.log("intToBitString(res, 8, true)");
console.log(res);
console.log("reverse:", bitStringToInt(res, 8, true));
console.log("---");
console.log("(uint16)5000");
res = intToBitString(5000, 16, true);
console.log("intToBitString(res, 16, true)");
console.log(res);
console.log("reverse:", bitStringToInt(res, 16, true));
console.log("---");
console.log("(uint32)5000");
res = intToBitString(5000, 32, true);
console.log("intToBitString(res, 32, true)");
console.log(res);
console.log("reverse:", bitStringToInt(res, 32, true));
console.log("---");
एक और विकल्प
const decToBin = dec => {
let bin = '';
let f = false;
while (!f) {
bin = bin + (dec % 2);
dec = Math.trunc(dec / 2);
if (dec === 0 ) f = true;
}
return bin.split("").reverse().join("");
}
console.log(decToBin(0));
console.log(decToBin(1));
console.log(decToBin(2));
console.log(decToBin(3));
console.log(decToBin(4));
console.log(decToBin(5));
console.log(decToBin(6));
यह मेरा कोड है:
var x = prompt("enter number", "7");
var i = 0;
var binaryvar = " ";
function add(n) {
if (n == 0) {
binaryvar = "0" + binaryvar;
}
else {
binaryvar = "1" + binaryvar;
}
}
function binary() {
while (i < 1) {
if (x == 1) {
add(1);
document.write(binaryvar);
break;
}
else {
if (x % 2 == 0) {
x = x / 2;
add(0);
}
else {
x = (x - 1) / 2;
add(1);
}
}
}
}
binary();
इसका उपाय है। तथ्य की बात के रूप में यह काफी सरल है
function binaries(num1){
var str = num1.toString(2)
return(console.log('The binary form of ' + num1 + ' is: ' + str))
}
binaries(3
)
/*
According to MDN, Number.prototype.toString() overrides
Object.prototype.toString() with the useful distinction that you can
pass in a single integer argument. This argument is an optional radix,
numbers 2 to 36 allowed.So in the example above, we’re passing in 2 to
get a string representation of the binary for the base 10 number 100,
i.e. 1100100.
*/