2015-04-04 27 views
1

這裏簡單的工作代碼左移一個字節如何使用Golang移位字節數組?

package main 

import (
    "fmt" 
) 

type Byte byte 

func SL(b Byte) Byte { 
    if b&0x80 == 0x80 { 
     b <<= 1 
     b ^= 0x01 
    } else { 
     b <<= 1 
    } 
    return b 
} 

func main() { 
    var b Byte 
    b = 0xD3 
    fmt.Printf("old byte %#08b\n", b) // 11010011 
    c := SL(b) 
    fmt.Printf("new byte %#08b", c) // 10100111 
} 

的第一位我應該怎麼做轉移的字節數組,像 type Byte [2]byte

感謝您的提前!

+1

注意,除了特殊情況外,Go切片比數組更常見。另外,在這種情況下,請考慮使用'uint16'。 – 2015-04-04 07:18:57

回答

2

你似乎想旋轉,不移位。您沒有使用uint16類型而不是[2]byte的任何特定原因?

無論如何,如果你真的想[2]byte,這是簡單,沒有分支:

func rol(v [2]byte) [2]byte { 
    x := int(v[0])<<8 | int(v[1]) 
    x <<= 1 
    v[0] = byte(x >> 8) 
    v[1] = byte((x & 0xff) | x>>16) 
    return v 
} 

如果你想上的任意大量的比特可以使用math/big做這樣的操作。

+0

謝謝,戴夫C!是的,我稍後在關於'uint16'的文檔中找到。困惑。而你的func比我的更漂亮。我的壞英語不能幫助我),我的意思是'旋轉'而不是'shift'。抱歉 – user4611478 2015-04-04 07:38:58

1

是的!我找到了解決方案。

package main 

import (
    "fmt" 
) 

type Byte [2]byte 

//shift left 
func SL(b Byte) Byte { 
    if b[0]&0x80 == 0x80 { 
     b[0] <<= 1 
     if b[1]&0x80 == 0x80 { 
      b[0] ^= 1 
      b[1] <<= 1 
     } else { 
      b[1] <<= 1 
     } 
     b[1] ^= 0x01 
    } else { 
     b[0] <<= 1 
     if b[1]&0x80 == 0x80 { 
      b[0] ^= 1 
      b[1] <<= 1 
     } else { 
      b[1] <<= 1 
     } 
    } 
    return b 
} 

func main() { 
    //var b Byte 
    b := Byte{0x23, 0x86} 
    fmt.Printf("old byte %#08b %#08b\n", b[0], b[1]) // 00100011 10000110 
    c := SL(b) 
    fmt.Printf("new byte %#08b %#08b", c[0], c[1]) // 01000111 00001100 
}