从伊格纳西奥·巴斯克斯(Ignacio Vazquez-Abrams)那里得到答案,并用计数而不是表格来完成:
b =〜i&(i + 1); //这在尾随的1的左侧给出1b--; //这使我们只需要计算尾随的1b =(b&0x55555555)+((b >> 1)&0x55555555); // 1位数字的2位和b =(b&0x33333333)+((b >> 2)&0x33333333); // 2位数字的4位和b =(b&0x0f0f0f0f)+((b >> 4)&0x0f0f0f0f); // 8位和4位数字b =(b&0x00ff00ff)+((b >> 8)&0x00ff00ff); // 8位数字的16位和b =(b&0x0000ffff)+((b >> 16)&0x0000ffff); // 16位数字的总和
b的末尾将包含1的计数(掩码,加法和移位计数1)。除非我当然喜欢。使用前进行测试。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)