代码之家  ›  专栏  ›  技术社区  ›  Zack Shapiro

UInt128与它所包含的2个UINT64有什么关系?

  •  -1
  • Zack Shapiro  · 技术社区  · 8 年前

    如果我有以下结构:

    public struct UInt128 {
        internal var value: (upperBits: UInt64, lowerBits: UInt64)
    }
    

    想象一下,一个初始值设定项创建了一个符合 UInt128 这个数字足够大,以至于它超过了 UInt64

    将高位和低位之和作为 UInt128 还是以另一种方式管理内存?

    为了处理小数字,如果每个 UInt64 是20,如果 UInt128 如果是24,则高位值是否为20,低位值是否为4?

    3 回复  |  直到 8 年前
        1
  •  6
  •   vacawama    8 年前

    想象一下,你被要求做一个 struct 表示4位数字,但只能存储2位数字。那么,你有一个 upperHalf 表示前2位和 lowerHalf 表示第二个2位数。

    let upperHalf = 12
    let lowerHalf = 34
    

    现在,你想把它们结合起来,得到完整的4位数字 1234 .

    你是怎么做到的?你添加了吗?

    12 + 34 = 46
    

    不,因为12不仅仅代表 12 . 真的是 1200 .

    1200 + 34 = 1234
    

    所以为了组合它们,你将 通过 100 腾出空间 对于较低的数字,然后添加 lowerHalf公司 .

    let upperHalf = 12
    let lowerHalf = 34
    let value = upperHalf * 100 + lowerHalf
    print(value)  // 1234
    

    那么,什么是 100 ? 它表示将基数为10的数字左移2位。对于每个班次,您将乘以 10 . 所以 2 班次是 10 * 10 100 .

    现在你的任务是使用两个 UInt8 代表a的数字 UInt16 数字

    let upperBits = 2
    let lowerBits = 1
    

    现在你想把它们结合起来 UInt16 价值就像在前面的例子中一样,您不能只添加它们。你需要改变 upperBits 在左边 8 为客户腾出空间的地方 lowerBits . 但是现在您使用的是二进制(基数2),所以每个移位都是通过乘以 2. .

    因此,结合 高位 低轨道交通 共两个 UInt8 值变为

    let value = (upperBits * 2 * 2 * 2 * 2 * 2 * 2 * 2 * 2) + lowerBits
    

    这与:

    let value = (upperBits * 256) + lowerBits
    

    也可以写成:

    let value = (upperBits << 8) + lowerBits
    

    << 8 意味着将位左移 8. 时代。

    所以如果 高位 2. 低轨道交通 1 然后

    let value = (2 * 256) + 1  // value = 513
    

    UInt64 代表a的数字 UInt128 ,您需要将 高位 在添加 低轨道交通 . 每次移位等于乘以 2. ,所以你必须乘 高位 通过 2 ^ 64 (或 18446744073709551616 )添加前腾出空间 低轨道交通 :

    概念上:

    let value: UInt128 = (upperBits << 64) + lowerBits 
    

    这与:

    let value: UInt128 = (upperBits * 18446744073709551616) + lowerBits
    
        2
  •  1
  •   zaph    8 年前

    考虑两个UInt8内存位置,其值在最高有效0000000 1,值00000010在最低有效,按正确顺序将UInt16连接为0000000 10000010,即258。最左边的8位代表256,最右边的2,256+2=258。或者只看16位UInt16,第一个(左)1表示256,最后一个(右)1表示2。

        3
  •  0
  •   Dave Weston    8 年前

    考虑到这个问题,我认为你将得到的任何答案都会过于简单化,但我的观点是:

    低位代表数字0到2^64-1,高位代表数字2^64到2^128-1

    如果您有两个64位数字,并希望将它们相加,则将高位64位向左移动。

    这有助于你的理解吗?