সি #, 148 বাইট
int x(int i){int s,r=0,j=i,p=System.Convert.ToString(i,2).Length+1,k;for(;--p>-1;){k=j;s=-1;for(;++s<p;)r+=(k>>=1);j=(i&((1<<p-1)-1))<<1;}return r;}
বা, যদি আমি "স্ট্যাটিক সিস্টেম ব্যবহার করে ম্যাথ; আমদানি" যুক্ত করি; তারপরে 138 এর সাথে
int x(int i){int s,r=0,j=i,p=(int)Round(Log(i,2)+1.49,0),k;for(;--p>-1;){k=j;s=-1;for(;++s<p;)r+=(k>>=1);j=(i&((1<<p-1)-1))<<1;}return r;}
সি # এর মতো ওওপি ভাষাগুলি এ জাতীয় প্রতিযোগিতা জিততে পারে না, তবে আমি যাইহোক এটি চেষ্টা করে দেখতে চাই। এখানে আরও সুশোভিত সংস্করণ + পরীক্ষক।
class Program
{
// Tester: 50 bytes
static void Main(string[] args)
{
int i=2;
do System.Console.WriteLine($"{i} -> {x(i++)}"); while (i < 12);
System.Console.Read();
}
// Function: 65 bytes (size according to ILDASM.exe)
static int x(int iOrg)
{
int pos, shift, retVal=0, iPrev=iOrg, iTemp;
pos = System.Convert.ToString(iOrg, 2).Length;
do {
iTemp = iPrev; shift = 0;
do retVal += (iTemp >>= 1); while (++shift < pos);
iPrev = (iOrg & ((1 << pos - 1) - 1)) << 1;
} while (--pos > -1);
return retVal;
}
}
নেস্টেড ডু-উইল আইটেম্পের ডান স্থানান্তরিত মান যুক্ত করে (এটি বরাদ্দ করার পরে) যতক্ষণ না শিফট +১ টি ছোট থাকে ততক্ষণ পোজ হয়। পরের লাইনটি আইপ্রেভের পরবর্তী স্থানান্তরিত মান গণনা করে
x1 = 1 << p -1; // 1 << 4 -1 = 8 [1000]
x2 = x1 - 1; // 8 - 1 = 7 [0111]
x3 = i & x2; // 1011 & 0111 = 0011
x4 = x3 << 1; // 0011 << 1 = 00110
i2 = x4;
x1 আন্ড এক্স 2 মাস্ক গণনা করে, এক্স 3 এটি প্রয়োগ করে এবং তারপর এটি বাম-শিফট করে, যেহেতু সর্বশেষ সংখ্যাটি সর্বদা বাদ পড়ে। 11 এর জন্য, এটি এর মতো দেখাচ্ছে:
START -> _1011[11]
101
10
1 --> X0110[6], r=0+5+2+1=8
011
01
0 --> XX110[6], r=8+4=12
11
1 --> XXX10[2], r=12+4=16
1 -> XXXX0[X], r=16+1=17