F# F中的位移位和字节到整数的转换#

F# F中的位移位和字节到整数的转换#,f#,xna,bitwise-operators,kinect,F#,Xna,Bitwise Operators,Kinect,我正在使用kinect在F#中做一些事情,但在处理深度数据时遇到了一些问题。我一直在学习本教程: 其中有c的例子,我一直想把它们转换成F 这部分代码有问题: void kinectSensor_DepthFrameReady(object sender, ImageFrameReadyEventArgs e) { PlanarImage p = e.ImageFrame.Image; Color[] DepthColor = new Color[p.Height * p.Width];

我正在使用kinect在F#中做一些事情,但在处理深度数据时遇到了一些问题。我一直在学习本教程:

其中有c的例子,我一直想把它们转换成F

这部分代码有问题:

void kinectSensor_DepthFrameReady(object sender, ImageFrameReadyEventArgs e)
{
PlanarImage p = e.ImageFrame.Image;

    Color[] DepthColor = new Color[p.Height * p.Width];

    float maxDist = 4000;
    float minDist = 850;
    float distOffset = maxDist – minDist;

    kinectDepthVideo = new Texture2D(GraphicsDevice, p.Width, p.Height);

    int index = 0;
    for (int y = 0; y < p.Height; y++)
    {
        for (int x = 0; x < p.Width; x++, index += 2)
        {
            int n = (y * p.Width + x) * 2;
            int distance = (p.Bits[n + 0]  |  p.Bits[n + 1] << 8);
            byte intensity = (byte)(255 – (255 * Math.Max(distance – minDist, 0) / (distOffset)));
            DepthColor[y * p.Width + x] = new Color(intensity, intensity, intensity);

        }
    }
}
void kinectSensor_DepthFrameReady(对象发送器,ImageFrameReadyEventArgs e)
{
平面图像p=e.ImageFrame.Image;
颜色[]深度颜色=新颜色[p.高度*p.宽度];
float maxDist=4000;
浮动正念=850;
float-distOffset=maxDist–Minist;
kinectDepthVideo=新纹理2D(图形设备,p.宽度,p.高度);
int指数=0;
对于(int y=0;yint distance=(p.Bits[n+0]| p.Bits[n+1]下面的代码片段显示,从
数组的两个相邻
字节
int
的转换是正确的:

let bytes = [|1uy;1uy|]
let distance = int bytes.[0] ||| (int bytes.[1] <<< 8)
printfn "%08X" distance
00000101
val bytes : byte [] = [|1uy; 1uy|]
val distance : int = 257
let bytes=[1uy;1uy]

让distance=int字节。[0]| | | |(int字节。[1]下面的代码片段显示,从
数组的两个相邻
字节
int
的转换是正确的:

let bytes = [|1uy;1uy|]
let distance = int bytes.[0] ||| (int bytes.[1] <<< 8)
printfn "%08X" distance
00000101
val bytes : byte [] = [|1uy; 1uy|]
val distance : int = 257
let bytes=[1uy;1uy]

让distance=int字节。[0]| | | |(int字节。[1]暂时不确定,但请尝试添加paren,例如
(x | | | |)(实际上,在执行操作之前,您可能需要加宽到int,例如
((int x)| |((int y)谢谢@Brian我在这之前看到了下面的答案,但基本上是相同的是吗?确保它在使用括号的| | | | |之前进行位移位?不立即确定,但请尝试添加paren,例如
(x | | | | | |)(y实际上,在执行操作之前可能需要加宽到int,例如
((int x)| |)((int y)谢谢@Brian我在这之前看到了下面的答案,但基本上是相同的是吗?确保它在使用括号之前进行位移位?太棒了,谢谢!工作很顺利!我现在知道我做错了什么-我想。我认为我的代码“p.Bits.[n+0]| | p.Bits.[n+1]正确吗@Ewen:运算符优先级只是原始代码问题的一部分。问题的另一个同样重要的部分是操作数大小:移位
p位。[n+1]
在未将
字节扩展到更宽的类型之前,将字节向左扩展8位,这将有效地释放所有原始内容,而得到8个零位的结果。保存数据需要将
字节至少再扩展8位到
uint16
,或者更好地扩展到
int
你的右
字节
需要你同样扩展你的左
字节
。太棒了,这很有道理。我唯一遇到的另一个问题是位掩码。我想得到一个字节中最不重要的3位。我在谷歌上找不到太多关于搜索逻辑掩码或位掩码等的信息。在C中,它是“字节&&0x07“但我无法在F#-“pImg.Bits.[n]&&&0x07”(或7或00000111)中获得此值。到目前为止,你帮了大忙,如果你对此有任何想法,那就太好了。感谢提取3个低位的字节文字就是
7uy
。你可能想查看F#文字类型列表。感谢你的帮助和链接。现在明白了。谢谢!太棒了,谢谢!工作很愉快!我现在看到了我想要的我错了-我想。我认为我的代码“p.Bits.[n+0]| | | p.Bits.[n+1]@Ewen:运算符优先级只是原始代码问题的一部分。问题的另一个同样重要的部分是操作数大小:移位
p.Bits.[n+1]
在未将
字节扩展到更宽的类型之前,将字节向左扩展8位,这将有效地释放所有原始内容,而得到8个零位的结果。保存数据需要将
字节至少再扩展8位到
uint16
,或者更好地扩展到
int
你的右
字节
需要你同样扩展你的左
字节
。太棒了,这很有道理。我唯一遇到的另一个问题是位掩码。我想得到一个字节中最低的3个有效位。我在谷歌上找不到关于搜索逻辑掩码或位掩码等的更多信息。在C中是这样的“byte&&0x07”但我不能用F#-“pImg.Bits.[n]&&&0x07”(或7或00000111)来表示。到目前为止,你帮了大忙,如果你对此有任何想法,那就太好了。感谢提取3个低位的字节文字是简单的
7uy
。你可能想查看F#文字类型列表。感谢你的帮助和链接。现在就理解它。谢谢!