2015-04-04 4 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'. –

ответ

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 более симпатичный, чем мой. Мой плохой английский не помогает мне), я имею в виду 'rotate' вместо' shift'. сожалею – user4611478

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 
} 
Смежные вопросы