আমি কীভাবে জাভাস্ক্রিপ্টে কোনও পূর্ণসংখ্যাকে বাইনারি রূপান্তর করব?


299

আমি বাইনারি মধ্যে ধনাত্মক বা নেতিবাচক পূর্ণসংখ্যার দেখতে চাই।

বরং এই প্রশ্নটি পছন্দ করুন তবে জাভাস্ক্রিপ্টের জন্য।


2
a.toString (2) উদাহরণগুলি -1
বারলপ

1
বাইনারি থেকে দশমিক রূপান্তর করাও সম্ভব: স্ট্যাকওভারফ্লো
অ্যান্ডারসন গ্রিন

এবং যখন আমি "বাইনারি" বললাম, এটি কিছুটা দ্বিধাগ্রস্থ হতে পারে। আমার অর্থ অভ্যন্তরীণ বিট স্ট্রিং প্রতিনিধিত্ব, যা 2 এস পরিপূরক, সুতরাং ইতিবাচক সংখ্যাগুলি বেস 2 এবং একটি শীর্ষস্থানীয় 0 এর সাথে হবে (এবং নেতিবাচক সংখ্যাগুলি বিয়োগ চিহ্ন বা চিহ্ন চিহ্নের সাথে উপস্থাপিত হবে না, তবে একটি হিসাবে তাদের ইতিবাচক
শ্রুতিমধুর ক্রিয়াকলাপ

উত্তর:


498
function dec2bin(dec){
    return (dec >>> 0).toString(2);
}

dec2bin(1);    // 1
dec2bin(-1);   // 11111111111111111111111111111111
dec2bin(256);  // 100000000
dec2bin(-256); // 11111111111111111111111100000000

আপনি Number.toString(2)ফাংশনটি ব্যবহার করতে পারেন তবে negativeণাত্মক সংখ্যার প্রতিনিধিত্ব করার সময় এতে কিছু সমস্যা রয়েছে। উদাহরণস্বরূপ, (-1).toString(2)আউটপুট হয় "-1"

এই সমস্যাটি সমাধানের জন্য, আপনি >>>স্বাক্ষরবিহীন পূর্ণসংখ্যায় আপনার নম্বর জবরদস্ত করতে স্বাক্ষরবিহীন ডান শিফট বিটওয়াইস অপারেটর ( ) ব্যবহার করতে পারেন ।

আপনি যদি চালনা করেন তবে (-1 >>> 0).toString(2)আপনার নম্বর 0 বিটটি ডানদিকে সরিয়ে ফেলবেন, যা নম্বরটি নিজেই পরিবর্তন করে না তবে এটি স্বাক্ষরবিহীন পূর্ণসংখ্যার হিসাবে উপস্থাপিত হবে। উপরের কোডটি "11111111111111111111111111111111"সঠিকভাবে আউটপুট দেবে ।

এই প্রশ্নের আরও ব্যাখ্যা আছে।

-3 >>> 0 (ডান লজিকাল শিফট) স্বাক্ষরবিহীন পূর্ণসংখ্যার সাথে তার যুক্তিগুলি জোর করে, যার কারণে আপনি 32-বিট টু -3 এর পরিপূরক উপস্থাপনা পান।


7
এখানে ব্যাখ্যাটি রয়েছে
ফার্নান্দোসাভিও

আমি যখন জাভাস্ক্রিপ্ট চেষ্টা করেছি তবে এখানে চেষ্টা করেছি w3schools.com/js/tryit.asp?filename=tryjs_output_alert এই <script> উইন্ডো.এলআর্ট ((- 3 >>> 0)। টু স্ট্রিং (2)) এর সাথে; </script> হ্যাঁ এটি কাজ করেছে
বার্লপ

1
টুস্ট্রিং (2) কাজ করে না কারণ আপনি পাঠ্য থেকে ইনপুট পাচ্ছেন। এটি ব্যবহার করুন: ফাংশন ডেকটোবেস (ডিস, বেস) {রিটার্ন পার্সেন্ট (ডিস) dec স্ট্রিং (বেস); } সতর্কতা (decToBase (ডিসি, 2));
ম্যাগাস

আপনি ধরে নিচ্ছেন যে ইনপুটটি পাঠ্য, তবে উত্তরের ফাংশনটি একটি পূর্ণসংখ্যার প্রত্যাশা করে ... সুতরাং, যদি ইনপুট কোনও পাঠ্য হয় তবে এটি কেবল পূর্ণসংখ্যায় রূপান্তর করে, জাল বিটশিফ্টটি ব্যবহার করুন এবং এটি সম্পন্ন হয়েছে
ফার্নান্দোসাভিও

@ ম্যাগাস কে পাঠ্য থেকে ইনপুট পাচ্ছেন ?!
বারলপ

207

চেষ্টা

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);
    }
}

আমি এখান থেকে কিছু সাহায্য পেয়েছিলাম


-1 এর জন্য কাজ করে না। একটি = -1; document.write (নম্বর (a.toString (2))); ডিসপ্লে -1
বার্লোপ

আপডেটটি এখনও নেতিবাচক সংখ্যা ( -3রিটার্ন 1) এর জন্য কাজ করে না বলে মনে হয় । এছাড়াও আমি বিশ্বাস করি dec > 0হওয়া উচিত dec >= 0, যা উচিত অন্তত ফিক্স 0 এ কারণে dec2Bin(0)আয় 10
অ্যাডাম মেরিফিল্ড 21

উপরের মন্তব্যে উভয় ক্ষেত্রেই আমার ক্রোম কনসোলের সঠিক ফলাফল ফিরে আসে - var a = -1; a.toString (2); "-1" var a = -3; a.toString (2); "-11"
আনমল সারাফ

@ আনমোলসারাফ আমি কী বলতে চাইছি তা আমি দেখতে পেয়েছি এবং কথোপকথন করার সময় লোকেরা দশমিক হিসাবে -5 কী বলে এবং উত্তরটি হয় -5 যখন বাইনারিতে নেতিবাচক সংখ্যার কথা আসে তবে এক অর্থে আপনি সেখানে একটি বিয়োগ চিহ্নটি আটকে রাখতে পারেন তাই 5 101 এবং -5 হয় -101 তবে কম্পিউটারগুলি বিয়োগ চিহ্নগুলি সংরক্ষণ করে না, সেগুলি কেবল 1s এবং 0 এর প্রতিনিধিত্ব করে, তাই আমরা যখন বাইনারিতে নেতিবাচক সংখ্যাগুলি বলি তখন আমরা সত্যিকার অর্থেই 1s এবং 0 এর মধ্যে নেতিবাচক সংখ্যা (বিয়োগ চিহ্ন অন্তর্ভুক্ত) স্থাপন করি। কিছু উপায়ে 1 এস পরিপূরক, 2 এস পরিপূরক এবং 'চিহ্ন এবং প্রসার' অন্তর্ভুক্ত। সুতরাং -101010101 বা -0101010 বাইনারিতে নেতিবাচক সংখ্যার দ্বারা লোকেরা কী বোঝায় তা নয়।
বারলপ

এই লিঙ্কটি কিছু স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 12337360 /… আগ্রহী হতে পারে যাইহোক , আপনার উত্তর নিজেই স্ববিরোধী, আপনি লিখেছেন "জাভাস্ক্রিপ্ট দুটি-পরিপূরক স্বরলিপিতে নেতিবাচক বাইনারি পূর্ণসংখ্যার প্রতিনিধিত্ব করে।" এবং আপনার কোডটি বলেছে "এখানে আপনি 2s প্রশংসায় সংখ্যাটি উপস্থাপন করতে পারেন তবে এটি জেএস হিসাবে [ননসেন্স কারণ] হিসাবে ব্যবহার করে না" এবং আপনি কোনও রেফারেন্সও দেন না।
বারলপ

53

'রূপান্তরিত বাইনারি'-এ বাইনারিটি তিনটি প্রধান বিষয়কে উল্লেখ করতে পারে। অবস্থানগত নম্বর সিস্টেম, মেমরিতে বা 32 বিট বিটস্ট্রিংগুলিতে বাইনারি উপস্থাপনা। (64 বিট বিটস্ট্রিংয়ের জন্য প্যাট্রিক রবার্টসের উত্তর দেখুন )

1. সংখ্যা সিস্টেম

(123456).toString(2)সংখ্যাগুলিকে বেস 2 অবস্থানিক সংখ্যা ব্যবস্থায় রূপান্তর করবে । এই সিস্টেমে নেতিবাচক সংখ্যাগুলি দশমিকের মতো বিয়োগ চিহ্ন সহ লেখা হয়।

2. অভ্যন্তরীণ প্রতিনিধিত্ব

সংখ্যার অভ্যন্তরীণ উপস্থাপনা bit৪ বিট ভাসমান বিন্দু এবং কিছু সীমাবদ্ধতা এই উত্তরে আলোচনা করা হয় । নেই কোন সহজ উপায় জাভাস্ক্রিপ্ট কিংবা এক্সেস নির্দিষ্ট বিট এই একটি বিট স্ট্রিং উপস্থাপনা তৈরি করুন।

৩. মুখোশ এবং বিটওয়াইস অপারেটর

বিটওয়াইজ অপারেটররা কীভাবে কাজ করে সে সম্পর্কে এমডিএন এর একটি ভাল ধারণা রয়েছে । গুরুত্বপূর্ণভাবে:

বিটওয়াইজ অপারেটররা তাদের অপারেশনগুলিকে 32 বিটের ক্রম হিসাবে গণ্য করে (জিরো এবং একটি)

ক্রিয়াকলাপগুলি প্রয়োগ করার আগে bit৪ বিট ভাসমান পয়েন্ট নম্বরগুলি 32 বিট স্বাক্ষরিত পূর্ণসংখ্যায় ফেলে দেওয়া হয়। তারা ফিরে রূপান্তরিত হওয়ার পরে।

সংখ্যাগুলি 32-বিট স্ট্রিংয়ে রূপান্তর করার জন্য এখানে MDN উদাহরণ কোড।

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"

সরল নম্বর (নাম্বার)। টো স্ট্রিং (2) ব্যবহার না করে এই ফাংশনটি ব্যবহার করে কী সুবিধা হবে?
মাগাস

5
@ ম্যাগাস আমি মনে করি আমি সংখ্যা এবং বাইনারি স্ট্রিংয়ের মধ্যে পর্যাপ্ত পার্থক্য ব্যাখ্যা করেছি। একটি 32 বিট বাইনারি স্ট্রিং সর্বদা "1" গুলি এবং "0" গুলি সমন্বয়ে বত্রিশটি অক্ষর। টোস্ট্রিং প্রদত্ত বেসের সাথে অবস্থানগত নম্বর সিস্টেমগুলি ব্যবহার করে প্রতিনিধিত্ব করে এমন একটি আসল সংখ্যা প্রদান করে returns আপনি কেন স্ট্রিং চান তা এটি নির্ভর করে , তাদের খুব আলাদা অর্থ রয়েছে।
আনানফায়

দুঃখিত, আপনি ঠিক বলেছেন। আমি সোজা কোডে ঝাঁপিয়ে পড়লাম।
মাগাস

1
অন্যান্য পোস্ট পদ্ধতি ব্যবহার করে শীর্ষস্থানীয় 0 এর সাথে সমস্যা ছিল (বিশেষত এই সংখ্যাটিতে 536870912, দুটি শীর্ষস্থানীয় জিরো সরানো হয়েছে), তবে এই সমাধানটি এটি সঠিকভাবে পরিচালনা করেছিল।
উবারমাউস

@ উবারমাউস হ্যাঁ >>>> এর 0s এর শীর্ষস্থানীয় সমস্যা রয়েছে, আমি এটি গ্রহণ করব one
বারলপ

43

একটি সহজ উপায় হ'ল ...

Number(42).toString(2);

// "101010"

24
আমি পছন্দ করব(42).toString(2)
উইলেম ডি'হ্যাসিলার

33
বা আরও ছোট42..toString(2)
কেপেক্স

9
মানুষ এ নিয়ে লড়াই করছে। উত্তরটি সঠিক কারণ এটি কোনও পূর্ণসংখ্যার সাথে ইনপুট (42) ফেলেছে এবং সেই লাইনটি প্রয়োজন। আপনি যদি কোনও পাঠ্য ইনপুট থেকে আপনার 'নম্বর' পান তবে টুস্ট্রিং (2) কাজ করবে না।
মাগাস

4
@ কেপ্প, বুদ্ধিমান বুদ্ধিমান। তুমি কীভাবে জানলে?
পেসারিয়ার

2
@BatuG। সংখ্যার জন্য সিনট্যাক্স আপনাকে দশমিক বিভাজকের পরে অংশটি বাদ দিতে দেয়। আপনি 1.যা লিখতে পারেন যা একই 1.0বা ন্যায় 1(এবং একইভাবে আপনি সেই অংশটি আগেও বাদ দিতে পারেন এবং .5পরিবর্তে লিখতে পারেন 0.5)। সুতরাং উদাহরণে প্রথম বিন্দু হ'ল দশমিক বিভাজক যা সংখ্যার অংশ এবং দ্বিতীয় বিন্দুটি সেই সংখ্যায় পদ্ধতিটি কল করার জন্য ডট অপারেটর। আপনাকে দুটি বিন্দু ব্যবহার করতে হবে (বা বন্ধনীতে সংখ্যাটি মোড়ানো) এবং কেবল লিখতে পারে না 42.toString(2)কারণ পার্সার বিন্দুটিকে দশমিক বিভাজক হিসাবে দেখায় এবং অনুপস্থিত বিন্দু অপারেটরের কারণে একটি ত্রুটি ছুড়ে ফেলে।
কেপেক্স

30

2147483648 এর পরিসীমা মধ্যে একটি সুনির্দিষ্ট মান ঠিকানা ইনপুট করতে এই উত্তরটি প্রচেষ্টা 10 (2 31 ) - 9007199254740991 10 (2 53 -1)।


জাভাস্ক্রিপ্টে, সংখ্যায় সংরক্ষণ করা হয় 64 বিট ফ্লোটিং পয়েন্ট উপস্থাপনা , কিন্তু 32 বিট ইন্টিজার করতে, bitwise অপারেশন নিগৃহীত তাদের মধ্যে দুই এর সম্পূরক বিন্যাস , তাই কোন পদ্ধতির যা, bitwise অপারেশন ব্যবহার -2147483648 আউটপুট পরিসীমা সীমিত 10 (-2 31 ) - 2147483647 10 (2 31 -1)।

তবে, যদি বিটওয়াইজ অপারেশনগুলি এড়ানো হয় এবং কেবলমাত্র গাণিতিক ক্রিয়াকলাপগুলি ব্যবহার করে -৪-বিট ফ্লোটিং পয়েন্ট উপস্থাপনাটি সংরক্ষণ করা হয়, তবে আমরা কোনও নিরাপদ পূর্ণসংখ্যাকে -৪-বিট দুইয়ের পরিপূরক বাইনারি সংকেতে সাইন -৩৩-বিস্তৃত করে 53- বিটকে রূপান্তর করতে পারি 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}

পুরানো ব্রাউজারগুলির জন্য, পলিফিলগুলি নিম্নলিখিত ফাংশন এবং মানগুলির জন্য বিদ্যমান:

একটি যুক্ত বোনাস হিসাবে, আপনি ⌈ rad৪ / লগ (রেডিক্স) s সংখ্যায় negativeণাত্মক সংখ্যার জন্য দুটির পরিপূরক রূপান্তর সম্পাদন করলে আপনি যে কোনও রডিক্স (2–36) সমর্থন করতে পারেন 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যা একটি Float64Arrayএবং ক এর মধ্যে ইউনিয়ন তৈরি করতে ব্যবহৃত হয়েছিল Uint16Array, দয়া করে এই উত্তরের পুনর্বিবেচনার ইতিহাসটি দেখুন


ধন্যবাদ, এটি ভাল যে এটি 64 বিটের জন্য কাজ করে .. আপনি কি আমাকে এই উত্তরটির কোনও সুবিধা জানাতে পারেন অনান এর উত্তরে?
বারলোপ

2
অনেক বড় পরিসীমা? এটা তোলে জন্য কাজ করে -(2**53)-1যাওয়ার 2**53-1পরিবর্তে শুধু -(2**31)থেকে 2**31-1আন্নান এর উত্তর চাই।
প্যাট্রিক রবার্টস

হ্যাঁ এটি একটি বড় সুবিধা, আমি এটি পেয়েছি, এবং এটি করবে, যদিও এটি বেশ খানিকটা কোড, তবে আমি যা বোঝাতে চাইছিলাম তা হল, আমি যদি আগ্রহী অন্য কোনও সুবিধাগুলিও রাখি?
বারলপ

1
2 ** 32 + 1 থেকে, সর্বশেষ (ডানদিকের) বিটটি সেট করা উচিত তা সাফ হয়ে যায়।
লভ্রো

1
লাইনটি যখন কাজ করে: var exporter = ((uint16 [3] & 0x7FF0) >> 4) - 1023 + 1;
Lovro

15

একটি সমাধান যা আমি 32-বিটের জন্য জরিমানা করে যাব, কোডটি এই উত্তরটির শেষ, যা বিকাশকারী.মজিলা.অর্গ.এড. (এমডিএন) থেকে এসেছে তবে এ-এর জন্য কিছু লাইন যুক্ত করা হয়েছে) ফর্ম্যাটিং এবং বি) পরীক্ষা করে দেখুন যে সংখ্যা সীমার মধ্যে।

কিছু প্রস্তাবিত x.toString(2)যা নেতিবাচকদের জন্য কাজ করে না, এটি তাদের জন্য সেখানে একটি বিয়োগ চিহ্নটি আটকে রাখে, এটি কোনও ভাল নয়।

ফার্নান্দো একটি সাধারণ সমাধান উল্লেখ করেছেন (x>>>0).toString(2);যার মধ্যে নেতিবাচক জন্য এটি সূক্ষ্ম, তবে এক্স ইতিবাচক হলে একটি সামান্য সমস্যা রয়েছে। এর আউটপুটটি 1 দিয়ে শুরু হচ্ছে, যা ধনাত্মক সংখ্যার জন্য যথাযথ 2 এস পরিপূরক নয়।

2 এর পরিপূরকটিতে 0 এবং 1 সহ নেতিবাচক সংখ্যাগুলির সাথে শুরু হওয়া ইতিবাচক সংখ্যার বাস্তবতা বুঝতে না পারে এমন যে কেউ এই এসও কিউএনএকে 2 এস পরিপূরক হিসাবে পরীক্ষা করতে পারে। "2 এর পরিপূরক" কী?

একটি সমাধান ইতিবাচক সংখ্যার জন্য 0 প্রদানের সাথে জড়িত থাকতে পারে, যা আমি এই উত্তরটির পূর্ববর্তী সংশোধন করেছিলাম। এবং কেউ কখনও কখনও ৩৩ বিবিট সংখ্যাটি গ্রহণ করতে পারে, বা কেউ নিশ্চিত করতে পারে যে রূপান্তর করার সংখ্যাটি সীমার মধ্যে রয়েছে - (২ ^ 31) <= x <2 ^ 31-1। সুতরাং সংখ্যাটি সর্বদা 32 বিট হয়। বরং এটি না করে, আপনি এই সমাধানটি mozilla.org এ যেতে পারেন

প্যাট্রিকের উত্তর এবং কোডটি দীর্ঘ এবং স্পষ্টতই -৪-বিটের জন্য কাজ করে, তবে একটি বাগ ছিল যা একজন মন্তব্যকারী পেয়েছিল এবং মন্তব্যকারী প্যাট্রিকের বাগটি ঠিক করেছিল, তবে প্যাট্রিকের কোডে কিছু "ম্যাজিক নম্বর" রয়েছে যার বিষয়ে তিনি মন্তব্য করেননি এবং আছে ভুলে গেছে এবং প্যাট্রিক তার নিজের কোড / কেন এটি কাজ করে তা পুরোপুরি বুঝতে পারে না।

আনান এর কিছু ভুল এবং অস্পষ্ট পরিভাষা ছিল তবে এটি ডেভেলপার.মোজিলা.আর.এক্স https://developer.mozilla.org/en-US/docs/Web/JavaScript/References/Operators/Bitwise_Operators দ্বারা একটি সমাধান উল্লেখ করেছেন এটি 32-বিট সংখ্যার জন্য কাজ করে।

কোডটি বেশ কমপ্যাক্ট, তিনটি লাইনের একটি ফাংশন।

তবে আমি 8 টি বিটের গ্রুপে আউটপুট ফর্ম্যাট করতে একটি রেজেেক্স যুক্ত করেছি। জাভাস্ক্রিপ্টে হাজার হাজার বিভাজক হিসাবে কমা দিয়ে কোনও সংখ্যা কীভাবে প্রিন্ট করা যায় তার উপর ভিত্তি করে (আমি কেবল এটি 3 টি ডান থেকে বামে গ্রুপকরণ থেকে কমা যোগ করতে, 8 থেকে ডানে বামে গ্রুপিং করতে এবং স্পেসগুলি যুক্ত করে সংশোধন করেছি )

এবং, যখন মজিলা এন মাস্কের আকার সম্পর্কে জানানো হয়েছে (নম্বরটি দেওয়া হয়েছিল) .. যে এটি সীমার মধ্যে থাকতে হবে, তারা সংখ্যাটি সীমা ছাড়িয়ে যাওয়ার পরে কোনও ত্রুটির জন্য পরীক্ষা বা নিক্ষেপ করেনি, তাই আমি করেছি যোগ করা হয়েছে যে।

আমি নিশ্চিত নই কেন তারা তাদের প্যারামিটারটির নাম 'এন ম্যাস্ক' রেখেছিল তবে আমি এটি যেমন রেখে দেব।

তথ্যসূত্র: https://developer.mozilla.org/en-US/docs/Web/ জাভা স্ক্রিপ্ট / রেফারেন্স / অপারেটর / বিটওয়াইস_অপারেটর

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"


8

আপনি আপনার নিজের ফাংশনটি লিখতে পারেন যা বিটের অ্যারে দেয়। কীভাবে সংখ্যাগুলিকে বিটে রূপান্তর করতে হয় তার উদাহরণ

ভাজক | লভ্যাংশ | বিট / বাকি

2 | 9 | 1

2 | 4 | 0

2 | 2 | 0

~ | 1 | ~

উপরের রেখার উদাহরণ: 2 * 4 = 8 এবং বাকীটি 1 তাই 9 = 1 0 0 1

function numToBit(num){
    var number = num
    var result = []
    while(number >= 1 ){
        result.unshift(Math.floor(number%2))
        number = number/2
    }
    return result
}

নীচে থেকে উপরের অংশের অবশিষ্টাংশগুলি পড়ুন। মাঝামাঝি থেকে শীর্ষে অঙ্ক 1


1
বিটিডব্লিউ, তার Math.floor(number%2)বদলে আপনি কেন number = Math.floor(number/2)?
পেসারিয়ার

1
কারণটি% 2 নং / 2 এর সমান নয়। আমরা বাকী অংশে আগ্রহী না
সুপ্রিটশ 1289

0

এমন কিছু নিয়ে আসার জন্য আমি একটি ভিন্ন পদ্ধতির ব্যবহার করেছি। আমি আমার প্রকল্পে এই কোডটি ব্যবহার না করার সিদ্ধান্ত নিয়েছি, তবে আমি ভেবেছিলাম যে এটি কারওর পক্ষে কার্যকর হলে এটি কোনও প্রাসঙ্গিক রেখে দেব।

  • বিট-শিফটিং বা দু'জনের পরিপূরক জবরদস্তি ব্যবহার করে না।
  • আপনি যে বিটগুলি বেরিয়ে এসেছেন তা চয়ন করুন (এটি '8', '16', '32' এর বৈধ মানগুলি পরীক্ষা করে তবে আমি মনে করি আপনি এটি পরিবর্তন করতে পারেন)
  • আপনি এটিকে স্বাক্ষরিত বা স্বাক্ষরবিহীন পূর্ণসংখ্যার হিসাবে বিবেচনা করবেন কিনা তা বেছে নিন।
  • এটি স্বাক্ষরিত / স্বাক্ষরযুক্ত এবং বিটের সংখ্যার সংমিশ্রণের পরিসীমা সম্পর্কিত বিষয়গুলির জন্য অনুসন্ধান করবে, যদিও আপনি ত্রুটি পরিচালনার উন্নতি করতে চান।
  • এটিতে ফাংশনের "বিপরীত" সংস্করণ রয়েছে যা বিটগুলিকে ইন্টিতে ফিরিয়ে দেয়। আপনার প্রয়োজন হবে যেহেতু সম্ভবত আর কিছুই নেই যা এই আউটপুটটির ব্যাখ্যা করবে: ডি

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("---");


-1

আরও একটি বিকল্প

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));

দয়া করে ভিনসেন্টের উত্তর এবং এতে মন্তব্য দেখুন, এটি আপনার পোস্টিংয়ের ক্ষেত্রেও প্রযোজ্য হবে
বার্লপ ২r

এটি তার মতামত, মতভেদ ছাড়াই এবং অন্যদের কাছ থেকে কিছু চুক্তির সাথে মন্তব্য করে পোস্ট করা হয়েছিল, "এটি কম্পিউটার বিজ্ঞান অধ্যয়ন করার জন্য কীভাবে ম্যানুয়ালি করা যায় তা দেখার জন্য উপকারী হতে পারে, যাতে নিজেকে শেখানো যায়, তবে এটি আমি না আমি যদি জিজ্ঞাসা করি! আপনি যদি চাকাটি নিজে নিজে এটির মতো করে পুনর্বহাল করতে যাচ্ছেন, তবে এটি কমপক্ষে দক্ষতার বর্ধিত সুবিধা বা মান সহ্য করা মানগুলির আকারের বৃদ্ধির মতো কিছু সুবিধা সহ হওয়া উচিত I আমি দেখতে পাচ্ছি না see আপনার কাছ থেকে যে কোনও আলোচনা সেখানে এই জাতীয় কোনও সুবিধা উল্লেখ করে।
বারলপ

তদ্ব্যতীত, আপনার সমাধান সম্পূর্ণরূপে ব্যর্থ হয়, এটি ইতিবাচক সংখ্যাগুলি 1 দিয়ে শুরু করে এবং সম্পূর্ণ নেতিবাচক সংখ্যার জন্য ব্যর্থ হয়, এবং আমার প্রশ্নটি ইতিবাচক বা নেতিবাচক বলে উল্লেখ করেছে
বার্লপ ২r

সুতরাং আপনার "উত্তর "টি অনেকগুলি স্তরে ভুল। এবং আপনার উত্তর পোস্ট করার আগে অন্যান্য উত্তরগুলি সর্বদা পর্যালোচনা করা উচিত
বার্লপ

-2

এটি আমার কোড:

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();

3
এটি ম্যানুয়ালি কীভাবে করা যায় তা দেখার জন্য কম্পিউটার বিজ্ঞান অধ্যয়নের জন্য দরকারী হতে পারে, যাতে নিজেকে শেখানো যায় তবে আমি যা বলছি তা নয়! যদি আপনি হুইলটি সেইভাবে ম্যানুয়ালি করে এটি পুনরায় উদ্ভাবন করতে যাচ্ছেন, তবে এটি কমপক্ষে দক্ষতার বর্ধিত সুবিধা বা মান সহ্য করতে পারে এমন মানগুলির আকারের বৃদ্ধির মতো কিছু সুবিধা দিয়ে হওয়া উচিত। আমি আপনার কাছ থেকে এমন কোনও সুবিধা উল্লেখ করে কোনও আলোচনা দেখতে পাচ্ছি না।
বারলপ

-3

এটিই সমাধান। বিষয় হিসাবে এটি বেশ সহজ

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.
        */

1
ইতিমধ্যে সমাধানটি বহুবার প্রস্তাব করা হয়েছে এবং যেমন ইতিমধ্যে ওপি 30 মার্চ '12 তে 9:01-এ মন্তব্য করেছেন, নেতিবাচক সংখ্যার জন্য কাজ করে না।
অ্যাড্রিয়ান ডাব্লু

@ অ্যাড্রিয়ানডাব্লু আমি এটিকে নিম্নচাপের প্রস্তাব দিই। আমি লক্ষ্য করেছি আপনি না। আপনার তখন কোনও উত্তর কমিয়ে আনতে কী দরকার?!
বারলপ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.