时间包 `nsec()` 函数

time package `nsec()` function

我对时间包nsec()功能操作感到困惑。它在时间和纳秒掩码的 wall 属性 上应用 AND 运算符(即 1<<30-1 => 1111111111111111111111111111111)到 return 的纳秒值时间对象。我想知道 ANDING 一个带有 1<<30-1 的数字等于该数字(因为所有数字的值为 1),那么他们为什么要这样做?

func (t *Time) nsec() int32 {
    return int32(t.wall & nsecMask)
}

主要源码: https://cs.opensource.google/go/go/+/refs/tags/go1.16.7:src/time/time.go;l=164;drc=refs%2Ftags%2Fgo1.16.7

wall 字段是 uint64 类型,它包含的不仅仅是 纳秒:

// From high to low bit position, wall encodes a 1-bit flag (hasMonotonic),
// a 33-bit seconds field, and a 30-bit wall time nanoseconds field.

所以他们在这里做的是提取最后 30 位到 得到纳秒。