ECMAScript-এর স্থানান্তর পরিচিতি

বিন্যাস পরিচালকটি সংখ্যার প্রকৃত স্তর (যেখানে সংখ্যা 32টি স্থানের দ্বারা প্রদর্শিত) তে কাজ করে

সংখ্যা পুনরাবৃত্তি

ECMAScript সংখ্যার দুইটি ধরন রয়েছে, যেমন সংখ্যা (পজিটিভ ও নেগেটিভ সহ) ও আবহ সংখ্যা (শুধুমাত্র পজিটিভ সংখ্যা)। ECMAScript-এ, সকল সংখ্যা ফ্যাক্টরিয়াল সংখ্যা, কিন্তু কী অর্থে তা?

সংখ্যা পদ্ধতিতে 31টি স্থানটি ব্যবহার করে সংখ্যার মানকে প্রদর্শন করে, 32তম স্থানটি সংখ্যার সম্মুখভাগ প্রদর্শন করে, 0-এর স্থান পজিটিভ সংখ্যা, 1-এর স্থান নেগেটিভ সংখ্যা। মানকের সম্মুখভাগ -2147483648 থেকে 2147483647

বৈনারী রূপের সংখ্যা পদ্ধতিতে সংরক্ষিত হয়েছে, একটি ব্যবহার করা হয় পজিটিভ সংখ্যার জন্য, আর অন্যটি নেগেটিভ সংখ্যার জন্য। পজিটিভ সংখ্যা প্রকৃত বৈনারী রূপে সংরক্ষিত হয়, যেখানে প্রথম 31টি স্থানটির প্রত্যেকটি 2-র সমানূত্তরকে প্রদর্শন করে, যেখানে 1এর স্থান 0-এর স্থান0দ্বিতীয়তম (স্থান 1) 2-এর প্রদর্শন1নিচের চিত্রটিতে সংখ্যা 18-এর প্রদর্শনটি দেখুন, যেখানে ব্যবহৃত না হওয়া স্থানগুলি 0-এর দ্বারা পূর্ণ করা হয়, যার মানে তারা অবমূল্য

32 বিন্যাসিত বিন্যাসিত দশমিন্দ্রীয় সংখ্যা

18 এর বৈনারী সংস্করণটিতে শুধুমাত্র প্রথম 5টি স্থানটি ব্যবহার করা হয়, তারা এই সংখ্যার বৈধ স্থান। সংখ্যা কে বৈনারী স্ট্রিং হিসাবে রূপান্তরিত করুন, তাহলে বৈধ স্থানগুলি দেখা যাবে:

var iNum = 18;
alert(iNum.toString(2));	// "10010" প্রদর্শন

এই কোডটি শুধুমাত্র "10010" চালানো হয়, না তাৎক্ষণিকভাবে 18 এর 32 বিন্যাসের প্রদর্শন। অন্যান্য স্থানগুলি গুরুত্বপূর্ণ নয়, কারণ শুধুমাত্র প্রথম 5টি স্থানটি ব্যবহার করেই এই দশমিক মানকে নিশ্চিত করা যায়। নিচের চিত্র দেখুন:

5 বিন্যাসিত দশমিন্দ্রীয় সংখ্যা 18

নেতিবাচক সংখ্যা বাইনারি কোড হিসাবে সংরক্ষিত হয়, কিন্তু বাইনারি কম্পম্যান্ডের রূপে।সংখ্যার বাইনারি কম্পম্যান্ড গণনার পদক্ষেপ ৩টি রয়েছে:

  1. নেতিবাচক সংখ্যার বাইনারি প্রদর্শন নিশ্চিত করুন
  2. এই সংখ্যার নন-নেতিবাচক সংস্করণের বাইনারি প্রদর্শন নিশ্চিত করুন (উদাহরণস্বরূপ, -18-এর বাইনারি কম্পম্যান্ড গণনা করতে, প্রথমে 18-এর বাইনারি প্রদর্শন নিশ্চিত করতে হবে)
  3. বাইনারি রিভার্স এক্সপনেন্সের উপর 1 যোগ করুন

-18-এর বাইনারি প্রদর্শন নিশ্চিত করতে, প্রথমে 18-এর বাইনারি প্রদর্শন পাওয়া প্রয়োজন, যেমন নিচে দেখা যাচ্ছে:

0000 0000 0000 0000 0000 0000 0001 0010

পরবর্তীতে, বাইনারি রিভার্স এক্সপনেন্স গণনা করুন, যেমন নিচে দেখা যাচ্ছে:

1111 1111 1111 1111 1111 1111 1110 1101

শেষত, বাইনারি রিভার্স এক্সপনেন্সের উপর 1 যোগ করুন, যেমন নিচে দেখা যাচ্ছে:

1111 1111 1111 1111 1111 1111 1110 1101
                                      1
---------------------------------------
1111 1111 1111 1111 1111 1111 1110 1110

তাই, -18-এর বাইনারি প্রদর্শন 1111 1111 1111 1111 1111 1111 1110 1110।মনে রাখুন যে, সংজ্ঞায়িত সংখ্যা প্রক্রিয়াকরণের সময়, ডেভেলপারদের 31 বিট পরিদর্শন করা যায় না。

আশ্চর্যজনকভাবে, নেতিবাচক সংখ্যা বাইনারি স্ট্রিং হিসাবে রূপান্তরিত হলে, ECMAScript-এর কোনও বাইনারি কম্পম্যান্ড না হলেও, তা নিম্নলিখিত ভাবে নেতিবাচক সংখ্যার মান দ্বারা প্রদর্শিত হয়:

var iNum = -18;
alert(iNum.toString(2));	// ফেরত দেয় "-10010"

এই কোডটি "-10010" ফেরত দেয়, নয় বাইনারি কম্পম্যান্ড, এটি 31 বিট পরিদর্শন করার জন্য একটি সহজলভ্য উপায়।সহজতার জন্য, ECMAScript-এর সংখ্যা প্রক্রিয়াকরণকে একটি সহজ পদ্ধতিতে ব্যবহার করে, যাতে ডেভেলপারদের তাদের ব্যবহার নিয়ে চিন্তার প্রয়োজন না হয়।

অন্যদিকে, অসংজ্ঞায়িত সংখ্যা শেষ বিটকে আরেকটি সংখ্যা স্থান হিসাবে ব্যবহার করে।এই মোডে, 32-তম বিটটি সংখ্যার সমস্যা নয়, বরং 2-র মান31এই অতিরিক্ত বিটের কারণে, অসংজ্ঞায়িত সংখ্যার মান 0 থেকে 4294967295 পর্যন্ত।যেসব সংখ্যা 2147483647-এর কম, তারা সংজ্ঞায়িত সংখ্যার মতোই দেখায়, কিন্তু 2147483647-এর বেশি সংখ্যার জন্য, 31 বিট (সংজ্ঞায়িত সংখ্যায়, এই বিটটি সবসময় 0) ব্যবহার করতে হয়。

অসংজ্ঞায়িত সংখ্যা কেবল স্ট্রিং হিসাবে রূপান্তরিত হলে, তাদের বৈধ বিটগুলি ফিরিয়ে দেয়。

注意:সব পূর্ণসংখ্যা ডিফল্টভাবে সংরক্ষিত হয় সংজ্ঞায়িত সংখ্যা হিসাবে।শুধুমাত্র ECMAScript-এর বিট অপারেটরগুলি অসংজ্ঞায়িত সংখ্যা তৈরি করতে পারে。

বিট অপারেশন NOT

বিট অপারেশন NOT ডটকোড় (~) দ্বারা প্রতিনিধিত হয়, এটি ECMAScript-এর মধ্যে বাইনারি আরিথমেটিকের সাথে সংযুক্ত কয়েকটি অপারেটরের মধ্যে একটি।

位运算 NOT 是三步的处理过程:

  1. 把运算数转换成 32 位数字
  2. 把二进制数转换成它的二进制反码
  3. 把二进制数转换成浮点数

例如:

var iNum1 = 25;		//25 等于 00000000000000000000000000011001
var iNum2 = ~iNum1;	//转换为 11111111111111111111111111100110
alert(iNum2);		// ফলাফল "-26"

স্থান অপারেশন NOT-এর মূল অর্থ হল সংখ্যাকে কোনোপ্রকারই নেতিবাচক করা এবং ১ থেকে কমানো, তাই ২৫ থেকে -২৬ হয়। একই প্রক্রিয়াটি নিম্নরূপেও করা যায়:

var iNum1 = 25;
var iNum2 = -iNum1 -1;
alert(iNum2);	// ফলাফল "-26"

স্থান অপারেশন AND

স্থান অপারেশন AND-এর সংজ্ঞায়িত হয় (&), এটি সরাসরি সংখ্যার দ্বিবিন্যাস রূপকে অপারেশন করে। প্রত্যেক স্থানের গণনায়, AND অপারেশনটি নিম্নলিখিত নিয়ম অনুসরণ করে:

第一个数字中的数位 第二个数字中的数位 结果
1 1 1
1 0 0
0 1 0
0 0 0

উদাহরণস্বরূপ, ২৫ এবং ৩-কে AND অপারেশন করার কোড নিম্নরূপ:

var iResult = 25 & 3;
alert(iResult);	// ফলাফল "1"

25 এবং ৩-কে AND অপারেশন করার ফলাফল ১ হয়। কেন? এটি নিম্নরূপে বিশ্লেষণ করা যায়:

 25 = 0000 0000 0000 0000 0000 0000 0001 1001
  3 = 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------
AND = 0000 0000 0000 0000 0000 0000 0000 0001

দেখা যায় যে, ২৫ এবং ৩-এর মধ্যে, শুধুমাত্র একটি স্থান (স্থান ০) থেকে ১ থাকে, তাই, অন্যান্য স্থানগুলি যেমন ০ হয়, তাই ফলাফল ১

স্থান অপারেশন OR

স্থান অপারেশন OR-এর সংজ্ঞায়িত হয় (|), এটি সরাসরি সংখ্যার দ্বিবিন্যাস রূপকে অপারেশন করে। প্রত্যেক স্থানের গণনায়, OR অপারেশনটি নিম্নলিখিত নিয়ম অনুসরণ করে:

第一个数字中的数位 第二个数字中的数位 结果
1 1 1
1 0 1
0 1 1
0 0 0

এই উদাহরণে, AND অপারেশনের মতো, ২৫ এবং ৩-কে OR অপারেশন করার কোড নিম্নরূপ:

var iResult = 25 | 3;
alert(iResult);	// ফলাফল "27"

25 এবং 3-কে OR অপারেশন করার ফলাফল ২৭ হয়:

25 = 0000 0000 0000 0000 0000 0000 0001 1001
 3 = 0000 0000 0000 0000 0000 0000 0000 0011
--------------------------------------------
OR = 0000 0000 0000 0000 0000 0000 0001 1011

দুই সংখ্যার মধ্যে, ৪টি সংখ্যাস্থান রয়েছে যেখানে ১ থাকে, এই সংখ্যাস্থানগুলি ফলাফলে পাঠানো হয়। দ্বিবিন্যাস কোড ১১০১১ সমান ২৭

位运算 XOR

位运算 XOR 由符号(^)表示,当然,也是直接对二进制形式进行运算。XOR 不同于 OR,当只有一个数位存放的是 1 时,它才返回 1。真值表如下:

第一个数字中的数位 第二个数字中的数位 结果
1 1 0
1 0 1
0 1 1
0 0 0

对 25 和 3 进行 XOR 运算,代码如下:

var iResult = 25 ^ 3;
alert(iResult);	//输出 "26"

25 和 3 进行 XOR 运算的结果是 26:

 25 = 0000 0000 0000 0000 0000 0000 0001 1001
  3 = 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------
XOR = 0000 0000 0000 0000 0000 0000 0001 1010

可以看出,在两个数字中,共有 4 个数位存放的是 1,这些数位被传递给结果。二进制代码 11010 等于 26。

左移运算

左移运算由两个小于号表示(<<)。它把数字中的所有数位向左移动指定的数量。例如,把数字 2(等于二进制中的 10)左移 5 位,结果为 64(等于二进制中的 1000000):

var iOld = 2;		//等于二进制 10
var iNew = iOld << 5;	//等于二进制 1000000 十进制 64

注意:在左移数位时,数字右边多出 5 个空位。左移运算用 0 填充这些空位,使结果成为完整的 32 位数字。

সংখ্যা 2-কে ডানদিকে সরানো

注意:左移运算保留数字的符号位。例如,如果把 -2 左移 5 位,得到的是 -64,而不是 64。“符号仍然存储在第 32 位中吗?”是的,不过这在 ECMAScript 后台进行,开发者不能直接访问第 32 个数位。即使输出二进制字符串形式的负数,显示的也是负号形式(例如,-2 将显示 -10。)

有符号右移运算

有符号右移运算符由两个大于号表示(>>)。它把 32 位数字中的所有数位整体右移,同时保留该数的符号(正号或负号)。有符号右移运算符恰好与左移运算相反。例如,把 64 右移 5 位,将变为 2:

var iOld = 64; // বাইনারি 1000000
var iNew = iOld >> 5; // বাইনারি 10 দশমিক 2

একইভাবে, স্থান সরণের পরে খালি স্থান তৈরি হয়। এবার, খালি স্থানটি সংখ্যার ডানদিকে, কিন্তু সংকেত স্থানের পরে অবস্থান করে। ECMAScript এই খালি স্থানগুলিকে সংকেত স্থানের মান দ্বারা পূরণ করে, যার ফলে একটি সম্পূর্ণ সংখ্যা তৈরি হয়, যেমন চিত্রে দেখা যাচ্ছে:

সংখ্যা 64-কে সংজ্ঞায়ীকৃত ডানদিকে সরানো

অসংকেতিক ডানদিকের সরণ

অসংকেতিক ডানদিকের সরণ অপারেটরটি তিনটি বড় সংখ্যা (>>>)-এর মাধ্যমে প্রদর্শিত হয়, যা অসংকেতিক 32 বাইনারি সংখ্যার সকল স্থানকে একত্রিতভাবে ডানদিকে সরণ করে। পজিটিভ সংখ্যার জন্য, এই অপারেটরের ফলাফলটি সংকেতিক ডানদিকের সরণ অপারেটরের ফলাফলের মতোই হয়।

সংকেতিক ডানদিকের সরণ অপারেটরের উদাহরণ হিসাবে, 64-কে 5 স্থান ডানদিকে সরণ করলে, 2 হবে:

var iOld = 64; // বাইনারি 1000000
var iNew = iOld >>> 5; // বাইনারি 10 দশমিক 2

নেতিবাচক সংখ্যার জন্য, এটা ভিন্ন হয়。

অসংকেতিক ডানদিকের সরণ অপারেটর 0-এর মাধ্যমে সব খালি স্থানকে পূরণ করে। পজিটিভ সংখ্যার জন্য, এটি সংকেতিক ডানদিকের সরণ অপারেটরের মতোই কাজ করে, কিন্তু নেতিবাচক সংখ্যার জন্য, এটি নেতিবাচক হিসাবে হয়ে ওঠে।

অসংকেতিক ডানদিকের সরণ অপারেটরের ফলাফলটি একটি 32 বাইনারি পজিটিভ সংখ্যা, তাই নেতিবাচক সংখ্যার অসংকেতিক ডানদিকের সরণ অপারেটরের ফলাফলটি সংকেতিক ডানদিকের সরণ অপারেটরের ফলাফলের মতোই হয়।

এই কাজটি করতে, এই সংখ্যা অসংকেতিক সমতুল ফরম্যাটে রূপান্তরিত করতে হবে (যদিও সংখ্যা স্বতঃস্ফূর্ত সংকেতিক হয়), এই ফরম্যাটটি পাওয়া হতে পারে:

var iUnsigned64 = -64 >>> 0;

তারপর, Number টাইপের toString() ব্যবহার করে তার প্রকৃত বাইনারি প্রদর্শন পাওয়া, যা 2 এর ভিত্তিতে ব্যবহৃত:

alert(iUnsigned64.toString(2));

এটি 11111111111111111111111111000000 তৈরি করবে, যা সংকেতিক সংখ্যা -64 এর বাইনারি কম্পলিমেন্ট প্রদর্শন, কিন্তু এটি 4294967232 নিশ্চিতভাবে অসংকেতিক সংখ্যা।

এই কারণে, অসংকেতিক ডানদিকের সরণ অপারেটর ব্যবহার করার সময় সতর্ক হতে হবে。