int48.go 994 B

123456789101112131415161718192021222324252627282930313233343536
  1. /*
  2. * Copyright 2021 ByteDance Inc.
  3. *
  4. * Licensed under the Apache License, Version 2.0 (the "License");
  5. * you may not use this file except in compliance with the License.
  6. * You may obtain a copy of the License at
  7. *
  8. * http://www.apache.org/licenses/LICENSE-2.0
  9. *
  10. * Unless required by applicable law or agreed to in writing, software
  11. * distributed under the License is distributed on an "AS IS" BASIS,
  12. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  13. * See the License for the specific language governing permissions and
  14. * limitations under the License.
  15. */
  16. package rt
  17. const (
  18. MinInt48 = -(1 << 47)
  19. MaxInt48 = +(1 << 47) - 1
  20. )
  21. func PackInt(v int) uint64 {
  22. if u := uint64(v); v < MinInt48 || v > MaxInt48 {
  23. panic("int48 out of range")
  24. } else {
  25. return ((u >> 63) << 47) | (u & 0x00007fffffffffff)
  26. }
  27. }
  28. func UnpackInt(v uint64) int {
  29. v &= 0x0000ffffffffffff
  30. v |= (v >> 47) * (0xffff << 48)
  31. return int(v)
  32. }