Выход за пределы двоичного числа
Стояла задача, поменять i бит числа в 1 или 0. Я вроде разобрался, как это делается:
func changeBitTo1(val, position int) int {
mask := 1 << position
return val | mask
}
func changeBitTo0(val, position int) int {
mask := ^(1 << position)
return val & mask
}
, но столкнулся с проблемой, что если я в числе которое содержит, допустим 10 бит(0-9), попытаюсь поменять 12-ый бит в 1, то у меня получается поменять 12 бит а недостающее заполняется нулями. Пример:
//559=1000101111
log.Println(strconv.FormatInt(int64(changeBitTo1(559, 12)), 2))
//out: 1001000101111
//первая единица слева, это та которую я сам и установил, а вот следующие 2 нуля, вставились сами. Получилось, что если убрать здесь в результате первые 3 бита слева, то будет то же самое число(набор бит)
А мне нужно чтобы при попытке установить несуществующий бит, я мог сделать ата-та, мол "так нельзя, в числе всего 10 бит". Как можно отследить что пытаются поменять несуществующий бит?
UPD: по замечаниям программу доработал и теперь она такая
package main
import (
"fmt"
"strconv"
)
func changeBitTo1(val, position int) int {
mask := 1 << position
return val | mask
}
func changeBitTo0(val, position int) int {
mask := ^(1 << position)
return val & mask
}
func negative(val int) int {
return ^val + 1
}
func changeBit() (result int) {
var value, position, oneorzero int
fmt.Println("type: <value> <position to change> <1 or 0>")
fmt.Scanln(&value, &position, &oneorzero)
println(strconv.FormatInt(int64(value), 2))
if oneorzero == 1 && position == 63 {
result = negative(value)
}
if oneorzero != 0 && oneorzero != 1 {
result = 0
}
if oneorzero == 1 && position != 63 {
result = changeBitTo1(value, position)
}
if oneorzero == 0 {
result = changeBitTo0(value, position)
}
println(strconv.FormatInt(int64(result), 2))
return
}