让 a = 128uy - 一个 让 a = 128uy - -6ren">
gpt4 book ai didi

f# - F#位移运算符中的 360° 旋转 "feature"

转载 作者:行者123 更新时间:2023-12-01 02:24:44 26 4
gpt4 key购买 nike

F# 中的位移运算符是 documented当您将位移到值的末尾时不进行旋转。您可以在 F# Interactive 中看到这一点:

> 让 a = 128uy
- 一个<<< 1;;

val a : 字节 = 128uy
验证它:字节 = 0uy

也就是说,我们将高位从 128 的顶部移开,得到 0。

如果 F# 旋转位而不是将它们移到最后,我们将得到 1,作为 MSB 中的 1 位。位置将向下旋转到 LSB .

但是,如果对第二个语句稍作更改,则会得到令人惊讶的结果:

> 让 a = 128uy
- 一个<<< 8;;

val a : 字节 = 128uy
验证:字节 = 128uy

现在它看起来已经完成了字节中位的完整旋转!

为什么是这样?

最佳答案

这里发生的事情是 F# 正在做 modular arithmetic在进行移位之前,在位移运算符右侧的值上。对于无符号字节,它使用 mod 8,因为在 F# 字节中有 8 位。从 8 mod 8 是 0,它根本不移动字节中的位。

如果您稍微使用这些值,您可以更清楚地看到这一点:

> 让 a = 4uy
- 一个<<< 1;;

val a : 字节 = 4uy
验证:字节 = 8uy

> 一个 <<< 9;;
验证:字节 = 8uy
> 一个 <<< 17;;
验证:字节 = 8uy

我们在所有三种情况下都得到相同的结果,因为它们是 mod 中的等价表达式。 8.

右移 ( >>> ) 也会发生同样的事情,并且行为不仅限于字节。

关于f# - F#位移运算符中的 360° 旋转 "feature",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17437086/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com