blob: 20a84dc72111de35dbd2c1e1d81195ddf02ab0cc [file] [log] [blame]
// Copyright 2011 The Snappy-Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
// Package zigzag implements the zigzag mapping between signed and unsigned
// integers:
// +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)
}