Выход за пределы двоичного числа

Стояла задача, поменять 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
}

Ответы (0 шт):