--- /dev/null
+package tool
+
+// unsigned integer Exp-Golomb-coded syntax element with the left bit first
+func ue(d int) (r, move int) {
+ for d&0b10000000 == 0b00000000 {
+ move += 1
+ d = d << 1
+ }
+ for i := move; i >= 0; i-- {
+ r |= d & 0b10000000 >> (7 - i)
+ d = d << 1
+ }
+ return r - 1, 2*move + 1
+}
+
+// signed integer Exp-Golomb-coded syntax element with the left bit first
+func se(d int) (r, move int) {
+ for d&0b10000000 == 0b00000000 {
+ move += 1
+ d = d << 1
+ }
+ for i := move; i > 0; i-- {
+ r |= d & 0b10000000 >> (8 - i)
+ d = d << 1
+ }
+ if d&0b10000000 == 0b00000000 {
+ r = -r
+ }
+ return r, 2*move + 1
+}
--- /dev/null
+package tool
+
+import (
+ "testing"
+)
+
+func Test_ue(t *testing.T) {
+ if r, m := ue(0b01101100); r != 2 || m != 3 {
+ t.Fatal()
+ }
+}
+
+func Test_se(t *testing.T) {
+ if r, m := se(0b00101000); r != 2 || m != 5 {
+ t.Fatal()
+ }
+ if r, m := se(0b00100000); r != -2 || m != 5 {
+ t.Fatal()
+ }
+}