package main

/**
 * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
 *
 *
 * @param n int整型
 * @return int整型
 */
func NumberOf1(n int) int {
	// write code here
	var res int

	// 将 n 转换为 32 位二进制形式
	if n < 0 {
		n = n & 0xffffffff // 与 32 位 1 相与
	}
    // 每次 n-1 需要向高位的 1 借,相与后高位就变成了 0
	// 110011 110010  -> n = 110010
	// 110010 110001  -> n = 110000
	// 110000 101111  -> n = 100000
	// 100000 011111  -> n = 000000
	// 共四次
	for n != 0 {
		n = n & (n - 1)
		res++
	}

	return res
}