যদি কেবল সি # সমর্থিত মেশিন-নির্দিষ্ট অন্তর্নিহিত ... একটি একক নির্দেশ রয়েছে যা এটি x86 সমাবেশ ভাষায় এবং বেশিরভাগ অন্যান্য প্রসেসরের আর্কিটেকচারেও করতে পারে। তারপরে আপনি কেবল সংক্ষিপ্ততম কোডই নন, তবে খুব সম্ভবত দ্রুততম।
প্রকৃতপক্ষে, এই কোডটি দ্রুত তৈরি করার তুলনায় এই কোডটিকে সংক্ষিপ্ত করে তোলা একটি অত্যন্ত বিরক্তিকর সমস্যা । সত্যই ঝরঝরে, দক্ষ, বিট-টুইডলিং সমাধানগুলির সব ধরণের রয়েছে এবং আপনি কোনও সারণী ব্যবহার করে বিবেচনা করতে পারেন using
গল্ফিংয়ের ক্ষেত্রে এর কোনওটিই বিবেচ্য নয়। আমার কাছে মনে হচ্ছে আপনার বর্তমান সমাধানটি আপনি সবচেয়ে ভাল করতে পারেন। অবশ্যই, আপনি অতিরিক্ত অতিরিক্ত সাদা স্থানটি মুছে ফেলতে পারেন:
k<1?0:(int)Math.Log(k&-k,2)+1
আমি ব্যক্তিগতভাবে এটি লিখতে হবে:
k>0?(int)Math.Log(k&-k,2)+1:0
কারণ আমি মনে করি শর্তসাপেক্ষ পরীক্ষার দিকটি সেইভাবেই শূন্যের সাথে তুলনা করার জন্য এটি পরিষ্কারভাবে পরিষ্কার হয়েছে তবে আমি অনুমান করি এটি ছয়টি এক উপায়, অন্য অর্ধ ডজন অন্যান্য।
C # এর থেকে অন্তর্নিহিত রূপান্তর সমর্থন করে না intথেকে boolতাই আপনি সত্যিই শর্তসাপেক্ষ পরীক্ষা কোনও কমান পারে না, সি এবং সি ++ মত না।
আপনি double(আমার ফেরত হিসাবে Math.Log) থেকে স্পষ্ট কাস্টের সাথেও আটকে আছেন int, কারণ সি # এটি সুস্পষ্টভাবে ঘটতে দেয় না। অবশ্যই, এটি সাধারণত একটি ভাল জিনিস কারণ এটি নির্দেশ করে যে আপনার একটি আছে বড় কর্মক্ষমতা এখানে সমস্যা: একটি প্রচার intএকটি থেকে double, একটি লগ কম্পিউটিং double, এবং তারপর রূপান্তর doubleএকটি থেকে ফলাফলের পিছনে intহতে হবে ব্যাপক ধীর, তাই এটি সাধারণত কিছু যা আপনি এড়াতে চান কোড গল্ফ খেলে আপনি এগুলি ধরণের বিভ্রান্তি পোষণ করতে পারেন।
আমি প্রথমদিকে এসেছি
k > 0
? ((k & -k) >> 1) + 1
: 0
(অবশ্যই স্পষ্টতার জন্য অবরুদ্ধ), যা লগারিদম গ্রহণ করা এড়িয়ে যায় এবং তাই কোডের আকার এবং গতির উন্নতি। দুর্ভাগ্যক্রমে, এটি সর্বদা সঠিক উত্তর পায় না এবং আমি ধরে নিই যে এটি একটি জটিল নয়। :-) বিশেষত, যদি ইনপুট মান ( k) 8 এর গুণক হয় তবে এটি ব্যর্থ হয় fix এটি স্থিরযোগ্য, তবে Math.Logসংস্করণটির চেয়ে কোডটি দীর্ঘ না করেই নয় ।