1017.负二进制转换

97 阅读1分钟

题目:
给你一个整数 n ,以二进制字符串的形式返回该整数的 负二进制(base -2 表示。

注意, 除非字符串就是 "0",否则返回的字符串中不能含有前导零。
算法:
方法一:模拟
先考虑模拟正二进制的转换,负二进制的权重: 1 -2 4 -8 16 -32 64 -128 每隔一个位置,权重为负数。为什么转换为负数之后的最低位是准确的呢?!!! 9(1001)->4(100),得到1 -4(1100)->-2(110),得到0 2(10)->1(1),得到0 -1(11)->0(1),得到1 但是为什么这样可以呢?
因为位权完全模拟了这个过程: 1 -2 4 -8 16 -32 64 -128

func baseNeg2(n int) string {
	if n == 0 {
		return "0"
	}
	ans := make([]string, 0)

	for n != 0 {
		if n & 1 == 0 {
			ans = append(ans, "0")
		} else {
			ans = append(ans, "1")
		}
		n = -(n >> 1)
	}

	left, right := 0, len(ans) - 1
	for left < right {
		ans[left], ans[right] = ans[right], ans[left]
		left ++
		right --
	}
	return strings.Join(ans,"")
}