ถ้าเฉพาะ C # ที่รองรับเฉพาะเครื่องภายใน ... มีคำสั่งเดียวที่สามารถทำได้ในภาษาแอสเซมบลี x86 และสถาปัตยกรรมตัวประมวลผลอื่น ๆ ส่วนใหญ่เช่นกัน จากนั้นคุณจะไม่เพียง แต่มีรหัสย่อที่สุดเท่านั้น
ความจริงแล้วการทำให้โค้ดนี้สั้นลงเป็นปัญหาที่น่าเบื่ออย่างยิ่งเมื่อเปรียบเทียบกับการทำให้โค้ดนี้เร็วขึ้น มีทุกประเภทของโซลูชั่นที่ประณีตมีประสิทธิภาพและมีประสิทธิภาพมากและคุณสามารถลองใช้ตารางค้นหา
ไม่มีสิ่งใดที่มีความสำคัญต่อการเล่นกอล์ฟ ดูเหมือนว่าฉันจะแก้ปัญหาในปัจจุบันของคุณเป็นสิ่งที่ดีที่สุดที่คุณสามารถทำได้ แน่นอนคุณสามารถลบช่องว่างที่ไม่จำเป็นออกได้:
k<1?0:(int)Math.Log(k&-k,2)+1
ส่วนตัวฉันจะเขียนมันเป็น:
k>0?(int)Math.Log(k&-k,2)+1:0
เพราะฉันคิดว่ามันชัดเจนกว่าเล็กน้อยที่จะมีทิศทางของการทดสอบตามเงื่อนไขเช่นเดียวกับการเปรียบเทียบกับศูนย์ แต่ฉันคิดว่ามันเป็นหกทางเดียวครึ่งอีกครึ่งโหล
C # ไม่รองรับการแปลงโดยนัยจากint
เป็นbool
ชอบ C และ C ++ ทำดังนั้นคุณจึงไม่สามารถย่อการทดสอบตามเงื่อนไขอีกต่อไปได้
คุณยังติดอยู่กับการส่งที่ชัดเจนจากdouble
(ตามที่ส่งคืนของฉันMath.Log
) ถึงint
เนื่องจาก C # จะไม่อนุญาตให้สิ่งนี้เกิดขึ้นโดยปริยาย แน่นอนว่าปกติเป็นสิ่งที่ดีเพราะมันจะชี้ให้เห็นว่าคุณมีขนาดใหญ่ปัญหาประสิทธิภาพการทำงานที่นี่: การส่งเสริมint
ไปdouble
คำนวณบันทึกที่double
แล้วแปลงdouble
ผลกลับไปที่int
จะได้รับอย่างหนาแน่นช้าดังนั้นจึงเป็นเรื่องปกติบางสิ่งบางอย่าง ที่คุณต้องการหลีกเลี่ยง แต่นี่คือความวิปริตที่คุณต้องทนเมื่อเล่นกอล์ฟ
ตอนแรกฉันคิด
k > 0
? ((k & -k) >> 1) + 1
: 0
(แน่นอนว่าไม่ดีสำหรับความชัดเจน) ซึ่งหลีกเลี่ยงการใช้ลอการิทึมดังนั้นจึงเป็นการปรับปรุงขนาดและความเร็วของโค้ด น่าเสียดายที่นี่ไม่ได้คำตอบที่ถูกต้องเสมอไปและฉันคิดว่านั่นเป็นข้อกำหนดที่ไม่ยืดหยุ่น :-) โดยเฉพาะมันล้มเหลวถ้าค่าอินพุต ( k
) เป็นปัจจัย 8 นี่เป็นสิ่งที่แก้ไขได้ แต่ไม่ใช่โดยไม่ทำให้โค้ดยาวกว่าMath.Log
เวอร์ชัน