|
|
@@ -4,20 +4,29 @@
|
|
|
|
|
|
// Package zigzag implements the zigzag mapping between signed and unsigned
|
|
|
// integers:
|
|
|
-// +0 <--> 0
|
|
|
-// -1 <--> 1
|
|
|
-// +1 <--> 2
|
|
|
-// -2 <--> 3
|
|
|
-// +2 <--> 4
|
|
|
+// +0 <-> 0
|
|
|
+// -1 <-> 1
|
|
|
+// +1 <-> 2
|
|
|
+// -2 <-> 3
|
|
|
+// +2 <-> 4
|
|
|
+// etcetera
|
|
|
//
|
|
|
// It is the same format used by protocol buffers. The format is described at
|
|
|
// http://code.google.com/apis/protocolbuffers/docs/encoding.html
|
|
|
package zigzag
|
|
|
|
|
|
+// Itou64 maps a signed integer to an unsigned integer.
|
|
|
+// If i >= 0, the result is 2*i.
|
|
|
+// If i < 0, the result is -2*i - 1.
|
|
|
+// The formulae above are in terms of ideal integers, with no overflow.
|
|
|
func Itou64(i int64) uint64 {
|
|
|
return uint64(i<<1 ^ i>>63)
|
|
|
}
|
|
|
|
|
|
+// Utoi64 maps an unsigned integer to a signed integer.
|
|
|
+// If u%2 == 0, the result is u/2.
|
|
|
+// If u%2 == 1, the result is -(u+1)/2.
|
|
|
+// The formulae above are in terms of ideal integers, with no overflow.
|
|
|
func Utoi64(u uint64) int64 {
|
|
|
return int64(u>>1) ^ -int64(u&1)
|
|
|
}
|