আমি বাইনারি মধ্যে ধনাত্মক বা নেতিবাচক পূর্ণসংখ্যার দেখতে চাই।
বরং এই প্রশ্নটি পছন্দ করুন তবে জাভাস্ক্রিপ্টের জন্য।
আমি বাইনারি মধ্যে ধনাত্মক বা নেতিবাচক পূর্ণসংখ্যার দেখতে চাই।
বরং এই প্রশ্নটি পছন্দ করুন তবে জাভাস্ক্রিপ্টের জন্য।
উত্তর:
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 এর পরিপূরক উপস্থাপনা পান।
চেষ্টা
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. অভ্যন্তরীণ প্রতিনিধিত্ব
সংখ্যার অভ্যন্তরীণ উপস্থাপনা 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"
একটি সহজ উপায় হ'ল ...
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 বিট ইন্টিজার করতে, 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
, দয়া করে এই উত্তরের পুনর্বিবেচনার ইতিহাসটি দেখুন ।
-(2**53)-1
যাওয়ার 2**53-1
পরিবর্তে শুধু -(2**31)
থেকে 2**31-1
আন্নান এর উত্তর চাই।
একটি সমাধান যা আমি 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"
আপনি আপনার নিজের ফাংশনটি লিখতে পারেন যা বিটের অ্যারে দেয়। কীভাবে সংখ্যাগুলিকে বিটে রূপান্তর করতে হয় তার উদাহরণ
উপরের রেখার উদাহরণ: 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
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.
*/