জাভাস্ক্রিপ্টে ~~ ("ডাবল টিল্ড") কী করে?


204

আমি আজ একটি অনলাইন গেম ফিজিক্স লাইব্রেরি পরীক্ষা করছিলাম এবং ~~ অপারেটর জুড়ে এসেছি। আমি জানি যে একটি একক a কিছুটা নয়, এটি কি একটি নোটের নোট তৈরি করবে যা একই মানটি ফেরত দেবে, তা নয়?


উত্তর:


248

এটি দশমিক পয়েন্টের পরে সমস্ত কিছু সরিয়ে দেয় কারণ বিটওয়াইস অপারেটরগুলি স্পষ্টভাবে স্বাক্ষরিতভাবে তাদের অপারেশনগুলিকে স্বাক্ষরিত 32-বিট পূর্ণ সংখ্যায় রূপান্তর করে। অপারেন্ডগুলি (ভাসমান-পয়েন্ট) সংখ্যা বা স্ট্রিংগুলি কিনা ফলাফলটি কাজ করে এবং ফলাফলটি একটি সংখ্যা।

অন্য কথায়, এটি ফলন করে:

function(x) {
  if(x < 0) return Math.ceil(x);
  else return Math.floor(x);
}

কেবলমাত্র x - (2 31 ) এবং 2 31 - 1 এর মধ্যে থাকলে অন্যথায়, ওভারফ্লো হবে এবং সংখ্যাটি "চারপাশে মোড়ানো" হবে।

এটি কোনও ফাংশনের স্ট্রিং আর্গুমেন্টকে একটি সংখ্যায় রূপান্তর করতে দরকারী বলে বিবেচিত হতে পারে তবে উভয়ই ওভারফ্লো হওয়ার সম্ভাবনার কারণে এবং এটি অ-পূর্ণসংখ্যার সাথে ব্যবহারের জন্য ভুল কারণ, "কোড গল্ফ" ব্যতীত আমি সেভাবে এটি ব্যবহার করব না ( উদাঃ অর্থহীনভাবে আপনার প্রোগ্রামের উত্স কোডটি পঠনযোগ্যতা এবং দৃness়তার ব্যয়ে ছাঁটাই করা। আমি ব্যবহার +xবা Number(x)তার পরিবর্তে হবে।


এটি কীভাবে নয়

সংখ্যা -৩৩.২, উদাহরণস্বরূপ:

-43.2 10 = 1111111111111111111111111111010101 2

স্বাক্ষরিত (দুইটির পরিপূরক) 32-বিট বাইনারি নম্বর হিসাবে। (জাভাস্ক্রিপ্ট দশমিক বিন্দুর পরে যা আছে তা উপেক্ষা করে)) বিটগুলি উল্টিয়ে দেয়:

নন -৩৩ 10 = 00000000000000000000000010101010 2 = 42 10

আবার ইনভার্টিং দেয়:

নয় 42 10 = 1111111111111111111111111111010101 2 = -43 10

এটি থেকে পৃথক Math.floor(-43.2)যে negativeণাত্মক সংখ্যাগুলি শূন্যের দিকে গোলাকার, এটি থেকে দূরে নয়। (ফ্লোর ফাংশন, যা সমান -44 হবে, সর্বদা পরবর্তী নীচের পূর্ণসংখ্যার সাথে গোল হয়, নম্বরটি ইতিবাচক বা নেতিবাচক হোক না কেন))


6
কোনটি বলতে গেলে , ~~একটি কাটা কাটা ফাংশন তৈরির জন্য একটি সংক্ষিপ্ত পথ (এবং সম্ভবত একটি ভাল সমাধান?) , তবে সম্ভবত জাভাস্ক্রিপ্টে
রাফিন

4
জেএসলিন্ট এর ব্যবহার সম্পর্কে অভিযোগ করবে ~~
রিচার্ড কুক 18

1
ম্যাথ.ট্রুঙ্ক ()
জিতলজি

30

প্রথম ~ অপারেটর অপারেন্ডকে একটি পূর্ণসংখ্যাতে বাধ্য করে (সম্ভবত একটি স্ট্রিং বা বুলিয়ানকে মান জোর দেওয়ার পরে), তারপরে সর্বনিম্ন 31 বিটগুলি উল্টে দেয়। আনুষ্ঠানিকভাবে ECMAScript নম্বরগুলি সমস্ত ভাসমান-পয়েন্ট, তবে কিছু নম্বর স্পাইডারমোনকি ইঞ্জিনে 31-বিট সংখ্যার হিসাবে প্রয়োগ করা হয়।

আপনি এটি 1-উপাদান অ্যারেটিকে পূর্ণসংখ্যায় পরিণত করতে ব্যবহার করতে পারেন। ভাসমান-পয়েন্টগুলি সি নিয়ম অনুসারে রূপান্তরিত হয়, অর্থাৎ। ভগ্নাংশের অংশ কেটে নেওয়া।

দ্বিতীয় ~ অপারেটর বিটগুলি পিছনে উল্টে দেয়, যাতে আপনি জানেন যে আপনার একটি পূর্ণসংখ্যা থাকবে। এটি শর্ত বিবৃতিতে বুলিয়ানের মান চাপানোর মতো নয়, কারণ একটি খালি বস্তু true true সত্যের কাছে মূল্যায়ন করে, যেখানে ~~ {। মিথ্যাতে মূল্যায়ন করে।

js>~~"yes"
0
js>~~3
3
js>~~"yes"
0
js>~~false
0
js>~~""
0
js>~~true
1
js>~~"3"
3
js>~~{}
0
js>~~{a:2}
0
js>~~[2]
2
js>~~[2,3]
0
js>~~{toString: function() {return 4}}
4
js>~~NaN
0
js>~~[4.5]
4
js>~~5.6
5
js>~~-5.6
-5

1
শান্তি এখানে উদাহরণ সব জন্য ধন্যবাদ, এটি সত্যিই সাহায্য করেছে!
শেন টমলিনসন

6
এছাড়াও~~undefined // 0
রমম্পিয়ান

1
এছাড়াও~~null // 0
চবি

প্রযুক্তিগতভাবে আপনার ভুল অর্ডার রয়েছে। দ্বিতীয়টি ~আপনি প্রথমে যা বর্ণনা করেছেন তা ~করে এবং বিপরীতে। ~অপারেটর একটি ইউনারী অপারেটর এবং বাম ডান দিক থেকে interpereted হয় ~~Xভালো হয় ~(~X)ভালো (~~)X(যা একটি বাক্য গঠন ত্রুটি হবে)
yunzen

20

এর নাম ECMAScript 6 এ, সমতুল্য ~~হয় 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

পলিফিল:

function trunc(x) {
    return x < 0 ? Math.ceil(x) : Math.floor(x);
}

6
কিছুটা আশ্চর্যজনকভাবে, Math ম্যাথ.ট্রুঙ্ক, jsperf.com/math-trunc-vs-double-bitwise-not-operator এর চেয়ে দ্রুত । যদিও, সবকিছুই গতি সম্পর্কে নয়; পাঠযোগ্যতা।
গাজুস

3
Math এবং ম্যাথ.ট্রুঙ্কের মধ্যে একটি গুরুত্বপূর্ণ পার্থক্য রয়েছে: আপনি যদি একটি স্ট্রিং পাস করেন, বা এনএএন বা যে কোনও জিনিস যা একটি সংখ্যা নয়, ম্যাথ.ট্রুঙ্ক নাএনকে ফিরিয়ে দেবে, এবং always সবসময় একটি সংখ্যা ফিরে আসবে, এই ক্ষেত্রে, এটি ০.
বুজিনাস

Math.trunc অনুযায়ী, সীমিতভাবে দ্রুত ক্রোম 59+ মধ্যে ~~ চেয়ে jsperf.com/math-trunc-vs-double-bitwise-not-operator
জ্যাক স্টিম 15

12

~না বলে মনে হয় -(N+1)। সুতরাং ~2 == -(2 + 1) == -3আপনি যদি এটি -3-এ আবার করেন তবে এটি আবার ফিরবে: ~-3 == -(-3 + 1) == 2এটি সম্ভবত একটি স্ট্রিংটিকে একটি রাউন্ড-অ্যাওয়েতে কোনও সংখ্যায় রূপান্তরিত করে।

এই থ্রেডটি দেখুন: http://www.sitepPoint.com/forums/showthread.php?t=663275

এছাড়াও, আরও বিস্তারিত তথ্য এখানে পাওয়া যায়: http://dreaminginjavascript.wordpress.com/2008/07/04/28/


লিঙ্কগুলির জন্য ধন্যবাদ ড্রাকির!
শেন টমলিনসন


3

কিছুটা সতর্কতা। এখানে অন্যান্য উত্তর আমাকে কিছুটা সমস্যায় ফেলেছে।

উদ্দেশ্যটি হ'ল কোনও ভাসমান পয়েন্ট সংখ্যার দশমিক পয়েন্টের পরে কোনও কিছু সরিয়ে ফেলতে হবে, তবে এর কিছু কোণার কেস রয়েছে যা এটি একটি বাগের ঝুঁকি তৈরি করে। আমি avo এড়ানো পরামর্শ দিই ~~

প্রথম, ~~ খুব বড় সংখ্যায় কাজ করে না।

~~1000000000000 == -727279968

বিকল্প হিসাবে, ব্যবহার Math.trunc()(গজুস উল্লিখিত হিসাবে, Math.trunc()একটি ভাসমান পয়েন্ট সংখ্যাটির পূর্ণসংখ্যার অংশটি প্রদান করে তবে কেবল ইসসিএমএসক্রিপ্ট 6 অনুবর্তী জাভাস্ক্রিপ্টে উপলব্ধ)। আপনি সর্বদা এটি করে Math.trunc()ECMAScript-6 নন-পরিবেশের জন্য নিজের তৈরি করতে পারেন :

if(!Math.trunc){
    Math.trunc = function(value){
        return Math.sign(value) * Math.floor(Math.abs(value));
    }
}

আমি রেফারেন্সের জন্য এটিতে একটি ব্লগ পোস্ট লিখেছি: http://bitlords.blogspot.com/2016/08/the-double-tilde-x-technique-in.html


1

এই অপারেটরটি কীভাবে দক্ষতার সাথে ব্যবহার করা যেতে পারে তার উদাহরণ এখানে দেওয়া হয়েছে, যেখানে এটির ব্যবহারটি বোধগম্য হয়:

leftOffset = -(~~$('html').css('padding-left').replace('px', '') + ~~$('body').css('margin-left').replace('px', '')),

উৎস:

পয়েন্টগুলির সাথে ইন্টারঅ্যাক্টিং বিভাগটি দেখুন


1

স্ট্রিংগুলিকে নাম্বারে রূপান্তর করা

console.log(~~-1);    // -1
console.log(~~0);     // 0
console.log(~~1);     // 1
console.log(~~"-1");  // -1
console.log(~~"0");   // 0
console.log(~~"1");   // 1
console.log(~~true);  // 1
console.log(~~false); // 0

~ -1 0 হয়

if (~someStr.indexOf("a")) {
  // Found it
} else  {
  // Not Found
}

উৎস


1

টিলডে (~) একটি অ্যালগরিহম রয়েছে - (এন + 1)

পরীক্ষার জন্য:

~0 = -(0+1) = -1
~5 = -(5+1) = -6
~-7 = -(-7+1) = 6

ডাবল টিল্ড হ'ল - (- (এন + 1) +1)

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

~~5 = -(-(5+1)+1) = 5
~~-3 = -(-(-3+1)+1) = -3

ট্রিপল টিল্ড হ'ল - (- (- (এন + 1) +1) +1)

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

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