আমি আজ একটি অনলাইন গেম ফিজিক্স লাইব্রেরি পরীক্ষা করছিলাম এবং ~~ অপারেটর জুড়ে এসেছি। আমি জানি যে একটি একক a কিছুটা নয়, এটি কি একটি নোটের নোট তৈরি করবে যা একই মানটি ফেরত দেবে, তা নয়?
আমি আজ একটি অনলাইন গেম ফিজিক্স লাইব্রেরি পরীক্ষা করছিলাম এবং ~~ অপারেটর জুড়ে এসেছি। আমি জানি যে একটি একক a কিছুটা নয়, এটি কি একটি নোটের নোট তৈরি করবে যা একই মানটি ফেরত দেবে, তা নয়?
উত্তর:
এটি দশমিক পয়েন্টের পরে সমস্ত কিছু সরিয়ে দেয় কারণ বিটওয়াইস অপারেটরগুলি স্পষ্টভাবে স্বাক্ষরিতভাবে তাদের অপারেশনগুলিকে স্বাক্ষরিত 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 হবে, সর্বদা পরবর্তী নীচের পূর্ণসংখ্যার সাথে গোল হয়, নম্বরটি ইতিবাচক বা নেতিবাচক হোক না কেন))
~~একটি কাটা কাটা ফাংশন তৈরির জন্য একটি সংক্ষিপ্ত পথ (এবং সম্ভবত একটি ভাল সমাধান?) , তবে সম্ভবত জাভাস্ক্রিপ্টে ।
~~।
প্রথম ~ অপারেটর অপারেন্ডকে একটি পূর্ণসংখ্যাতে বাধ্য করে (সম্ভবত একটি স্ট্রিং বা বুলিয়ানকে মান জোর দেওয়ার পরে), তারপরে সর্বনিম্ন 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
~~undefined // 0
~~null // 0
~আপনি প্রথমে যা বর্ণনা করেছেন তা ~করে এবং বিপরীতে। ~অপারেটর একটি ইউনারী অপারেটর এবং বাম ডান দিক থেকে interpereted হয় ~~Xভালো হয় ~(~X)ভালো (~~)X(যা একটি বাক্য গঠন ত্রুটি হবে)
এর নাম 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);
}
~না বলে মনে হয় -(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/
দেওয়া ~Nহয় -(N+1), ~~Nহয় -(-(N+1) + 1)। যা স্পষ্টতই ঝরঝরে কৌতুকের দিকে পরিচালিত করে ।
কিছুটা সতর্কতা। এখানে অন্যান্য উত্তর আমাকে কিছুটা সমস্যায় ফেলেছে।
উদ্দেশ্যটি হ'ল কোনও ভাসমান পয়েন্ট সংখ্যার দশমিক পয়েন্টের পরে কোনও কিছু সরিয়ে ফেলতে হবে, তবে এর কিছু কোণার কেস রয়েছে যা এটি একটি বাগের ঝুঁকি তৈরি করে। আমি 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
এই অপারেটরটি কীভাবে দক্ষতার সাথে ব্যবহার করা যেতে পারে তার উদাহরণ এখানে দেওয়া হয়েছে, যেখানে এটির ব্যবহারটি বোধগম্য হয়:
leftOffset = -(~~$('html').css('padding-left').replace('px', '') + ~~$('body').css('margin-left').replace('px', '')),
উৎস:
স্ট্রিংগুলিকে নাম্বারে রূপান্তর করা
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)
পরীক্ষার জন্য:
~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