C #, 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;}
หรือถ้าฉันเพิ่มการนำเข้า "using Static System.Math;" จากนั้น 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;}
ภาษา OOP เช่น C # จะไม่ชนะการแข่งขัน แต่ฉันต้องการลองต่อไป นี่คือรุ่นทดสอบที่สวยงามมากขึ้น
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;
    }
}
สิ่งที่ซ้อนกันทำในขณะนั้นเพิ่มมูลค่าที่ถูกกะขวาของ iTemp (หลังจากกำหนดมัน) ตราบใดที่การ Shift + 1 มีขนาดเล็กลงจะทำให้เกิด POS บรรทัดถัดไปจะคำนวณค่าที่เลื่อนถัดไปของ iPrev
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 และ x2 คำนวณหน้ากาก, x3 ใช้กับมันแล้วเลื่อนไปทางซ้ายเนื่องจากหลักสุดท้ายจะลดลงเสมอ สำหรับ 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