বিটওয়াইয়া বা 0 ব্যবহার করে কোনও সংখ্যা মেঝেতে


192

আমার এক সহকর্মী একটি পদ্ধতিতে হোঁচট খেয়েছিল কিছুটা বিটওয়াস ব্যবহার করে নম্বরগুলি মেঝেতে বা:

var a = 13.6 | 0; //a == 13

আমরা এটি সম্পর্কে কথা বলছিলাম এবং কয়েকটি বিষয় ভাবছিলাম।

  • এটা কিভাবে কাজ করে? আমাদের তত্ত্বটি ছিল যে এই জাতীয় অপারেটর ব্যবহার করে সংখ্যাটি পূর্ণসংখ্যার সাথে কাস্ট করে, ফলে ভগ্নাংশটি অপসারণ করা হয়
  • এটি করার কি কোনও সুবিধা আছে Math.floor? কিছুটা দ্রুত হতে পারে? (পাং উদ্দেশ্য নয়)
  • এর কোনও অসুবিধা আছে কি? সম্ভবত এটি কিছু ক্ষেত্রে কাজ করে না? স্পষ্টতা একটি সুস্পষ্ট একটি, যেহেতু আমাদের এটি খুঁজে বের করতে হয়েছিল, এবং ভাল, আমি এই প্রশ্নটি লিখছি।

ধন্যবাদ।


6
অসুবিধা: এটি কেবল 2 ^ 31−1 অবধি কাজ করে যা প্রায় 2 বিলিয়ন (10 ^ 9) এর কাছাকাছি। সর্বাধিক সংখ্যা মান 10 308 বিটিডব্লিউ।
Vidime Vidas

12
উদাহরণ: 3000000000.1 | 0-1294967296 এ মূল্যায়ন করে। সুতরাং এই পদ্ধতিটি অর্থ গণনার জন্য প্রয়োগ করা যাবে না (বিশেষত দশমিক সংখ্যাগুলি এড়ানোর জন্য যেখানে আপনি 100 দ্বারা গুণ করেন) in
Vidime Vidas

13
@ আইমভিডাস ফ্লোটগুলি অর্থের গণনায়ও ব্যবহার করা উচিত নয়
জর্জ রিথ

20
এটি মেঝে নয়, এটি কাটা হচ্ছে (0 এর দিকে গোলাকার)।
বার্তোমিয়েজ জালেউস্কি

3
@ সিকোয়েন্স 0.1 + 0.2 == 0.3একটি জাভাস্ক্রিপ্ট কনসোলে টাইপ করার চেষ্টা করুন । যদি আপনার ভাষা এটি সমর্থন করে তবে আপনার দশমিক প্রকারটি ব্যবহার করা উচিত। যদি না হয়, পরিবর্তে সেন্ট সঞ্চয় করুন।
অ্যালেক্স টারপিন

উত্তর:


161

এটা কিভাবে কাজ করে? আমাদের তত্ত্বটি ছিল যে এই জাতীয় অপারেটর ব্যবহার করে সংখ্যাটি পূর্ণসংখ্যার সাথে কাস্ট করে, ফলে ভগ্নাংশটি অপসারণ করা হয়

স্বাক্ষরযুক্ত ডান শিফট ব্যতীত সমস্ত বিটওয়াইস ক্রিয়াকলাপ >>>, স্বাক্ষরিত 32-বিট পূর্ণসংখ্যার উপর কাজ করে। সুতরাং বিটওয়াইজ অপারেশনগুলি ব্যবহার করে একটি ফ্লোটকে পূর্ণসংখ্যায় রূপান্তরিত করা হয়।

ম্যাথ.ফ্লুর করার ক্ষেত্রে এর কোনও সুবিধা আছে কি? কিছুটা দ্রুত হতে পারে? (পাং উদ্দেশ্য নয়)

http://jsperf.com/or-vs-floor/2 কিছুটা দ্রুত বলে মনে হচ্ছে

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

  • JsLint পাস করবে না।
  • 32-বিট স্বাক্ষরিত পূর্ণসংখ্যা কেবল
  • অদ্ভুত তুলনামূলক আচরণ: Math.floor(NaN) === NaNযখন(NaN | 0) === 0

9
@ প্রকৃতপক্ষে বিক্রয়, কারণ এটি আসলে চারদিকে নয়, কেবল ছাঁটাই হয়।
অ্যালেক্স টারপিন

5
আর একটি সম্ভাব্য অসুবিধা হ'ল Math.floor(NaN) === NaN, যখন (NaN | 0) === 0। কিছু অ্যাপ্লিকেশনে এই পার্থক্যটি গুরুত্বপূর্ণ হতে পারে।
টেড হপ

4
লুপ ইনভেআরেন্ট কোড গতির কারণে আপনার jsperf ক্রোমের ফাঁকা ফাঁকের জন্য পারফরম্যান্সের তথ্য দিচ্ছে। কিছুটা ভাল পারফ টেস্ট হবে: jsperf.com/floor-performance/2
স্যাম গাইলস

4
এটি একটি স্ট্যান্ডার্ড অংশ asm.js(যেখানে আমি এটি সম্পর্কে প্রথম জানতে পেরেছিলাম)। অন্য কোনও কারণে এটি দ্রুত হয় কারণ এটি Mathবস্তুটির কোনও ফাংশনকে কল করে না , এমন ফাংশন যা যে কোনও সময় স্থান হিসাবে প্রতিস্থাপন করা যেতে পারে Math.floor = function(...)
gman

3
(value | 0) === valueকোনও মানটি আসলে একটি পূর্ণসংখ্যা এবং কেবলমাত্র একটি পূর্ণসংখ্যা (এটি এলম উত্স কোড @ ডোয়াইন-ক্রুকস লিঙ্কযুক্ত হিসাবে) পরীক্ষা করে ব্যবহার করা যেতে পারে। এবং foo = foo | 0কোনও পূর্ণসংখ্যার (যেখানে 32-বিট সংখ্যা ছাঁটাই করা হয় এবং সমস্ত অ-সংখ্যা 0 হয়) কোনও মানকে বাধ্য করতে ব্যবহার করা যেতে পারে।
ডেভিড মাইকেল গ্রেগ

36

এই মেঝে বিপরীতে কাটা কাটা । হাওয়ার্ডের উত্তর এক প্রকারের সঠিক; তবে আমি যুক্ত করব যে Math.floorএটি নেতিবাচক সংখ্যার সাথে সম্মানজনকভাবে ঠিক করা হয়। গাণিতিকভাবে, এটিই তল what

আপনি উপরে বর্ণিত ক্ষেত্রে, প্রোগ্রামারটি দশমিক সম্পূর্ণ কাটা কাটা বা কাটাতে আরও আগ্রহী ছিল । যদিও, সিনট্যাক্সটি তারা ধরণের প্রকারের বিষয়টি ধূমপান করে যে তারা ভাসাটি কোনও ইনটকে রূপান্তর করছে।


7
এটি সঠিক উত্তর, গৃহীত একটি নয়। এটিতে যুক্ত করুন যা Math.floor(8589934591.1)প্রত্যাশিত ফলাফল দেয়, তা করেন 8589934591.1 | 0 না
সালমান এ

21

এর নাম ECMAScript 6 এ, সমতুল্য |0হয় Math.trunc , ধরনের আমি বলতে হবে:

যে কোনও ভগ্নাংশের অঙ্কগুলি সরিয়ে একটি সংখ্যার অবিচ্ছেদ্য অংশ প্রদান করে। এটি কেবল বিন্দু এবং এর পিছনে অঙ্কগুলি কেটে ফেলবে, তর্কটি কোনও ধনাত্মক সংখ্যা বা নেতিবাচক সংখ্যা নির্বিশেষে।

Math.trunc(13.37)   // 13
Math.trunc(42.84)   // 42
Math.trunc(0.123)   //  0
Math.trunc(-0.123)  // -0
Math.trunc("-1.123")// -1
Math.trunc(NaN)     // NaN
Math.trunc("foo")   // NaN
Math.trunc()        // NaN

6
আসলে ব্যতীত Math.trunc()নম্বর দিয়ে কাজ উচ্চতর বা 2 ^ 31 সমান এবং | 0না
Nolyurn

10

আপনার প্রথম পয়েন্টটি সঠিক। সংখ্যাটি পূর্ণসংখ্যায় ফেলে দেওয়া হয় এবং এর ফলে কোনও দশমিক অঙ্ক সরিয়ে ফেলা হয়। দয়া করে মনে রাখবেন, Math.floorপরের পূর্ণসংখ্যার রাউন্ডগুলি বিয়োগ অনন্তের দিকে যায় এবং এভাবে নেতিবাচক সংখ্যায় প্রয়োগ করার পরে একটি আলাদা ফলাফল দেয়।


5

জাভাস্ক্রিপ্ট ডাবল যথার্থ 64৪-বিট ভাসমান সংখ্যাNumber হিসাবে উপস্থাপন করে ।

Math.floor এটি মাথায় রেখে কাজ করে।

বিটওয়াইজ অপারেশনগুলি 32 বিট স্বাক্ষরিত পূর্ণসংখ্যায় কাজ করে। 32 বিট স্বাক্ষরিত পূর্ণসংখ্যাগুলি প্রথম বিটটিকে নেতিবাচক সিগনিফায়ার হিসাবে ব্যবহার করে এবং অন্যান্য 31 টি বিট সংখ্যা। এ কারণে, সর্বনিম্ন সর্বাধিক সংখ্যা অনুমোদিত 32 বিট স্বাক্ষরিত সংখ্যাগুলি যথাক্রমে -2,147,483,648 এবং 2147483647 (0x7FFFFFFFF)।

সুতরাং যখন আপনি করছেন | 0, আপনি মূলত করছেন & 0xFFFFFFFF। এর অর্থ, 0x80000000 (2147483648) বা ততোধিক হিসাবে প্রদর্শিত যে কোনও সংখ্যা numberণাত্মক সংখ্যা হিসাবে ফিরে আসবে।

উদাহরণ স্বরূপ:

 // Safe
 (2147483647.5918 & 0xFFFFFFFF) ===  2147483647
 (2147483647      & 0xFFFFFFFF) ===  2147483647
 (200.59082098    & 0xFFFFFFFF) ===  200
 (0X7FFFFFFF      & 0xFFFFFFFF) ===  0X7FFFFFFF

 // Unsafe
 (2147483648      & 0xFFFFFFFF) === -2147483648
 (-2147483649     & 0xFFFFFFFF) ===  2147483647
 (0x80000000      & 0xFFFFFFFF) === -2147483648
 (3000000000.5    & 0xFFFFFFFF) === -1294967296

এছাড়াও। বিটওয়াস অপারেশনগুলি "তল" করে না। তারা কেটে ফেলেছে , যা বলা হিসাবে একই, তারা সবচেয়ে কাছাকাছি গোল করে 0। একবার আপনি ঋণাত্মক সংখ্যা কাছাকাছি যান, Math.floorচক্রের নিচে যখন rounding, bitwise শুরু আপ

আমি আগেই বলেছি, Math.floorএটি নিরাপদ কারণ এটি 64 বিট ভাসমান সংখ্যার সাথে কাজ করে। বিটওয়াইস দ্রুত , হ্যাঁ, তবে 32 বিট স্বাক্ষরিত স্কোপের মধ্যে সীমাবদ্ধ।

সংক্ষেপ:

  • আপনি যদি কাজ করেন তবে বিটওয়াইস একই কাজ করে 0 to 2147483647
  • আপনি যদি কাজ করেন তবে বিটওয়াইসটি 1 নম্বর বন্ধ -2147483647 to 0
  • এর চেয়ে কম -2147483648এবং এর চেয়ে বেশি সংখ্যার জন্য বিটওয়াইজ সম্পূর্ণ আলাদা 2147483647

আপনি যদি সত্যিই পারফরম্যান্সটি সাম্প্রতিক করতে এবং উভয়টি ব্যবহার করতে চান:

function floor(n) {
    if (n >= 0 && n < 0x80000000) {
      return n & 0xFFFFFFFF;
    }
    if (n > -0x80000000 && n < 0) {
      return (n - 1) & 0xFFFFFFFF;
    }
    return Math.floor(n);
}

Math.truncবিটওয়াইজ অপারেশনের মতো কাজগুলি যুক্ত করতে । সুতরাং আপনি এটি করতে পারেন:

function trunc(n) {
    if (n > -0x80000000 && n < 0x80000000) {
      return n & 0xFFFFFFFF;
    }
    return Math.trunc(n);
}

5
  • চশমা বলে যে এটি একটি পূর্ণসংখ্যায় রূপান্তরিত হয়:

    Lnum কে ToInt32 (lval) হতে দিন।

  • পারফরম্যান্স: এটি এর আগে jsperf এ পরীক্ষা করা হয়েছে ।

দ্রষ্টব্য: নির্দিষ্ট মৃত লিঙ্ক সরানো হয়েছে

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