我正在学习关于操作系统的大学课程,我们正在学习如何从二进制转换为十六进制,十进制到十六进制等等.今天我们刚刚学习了如何使用二进制补码(〜数字)将有符号/无符号数存储在内存中+ 1).
我们在纸上做了几个练习,我希望能够在向老师提交作业之前验证我的答案.我为前几个练习编写了一个C++程序,但现在我不知道如何通过以下问题验证我的答案:
char a, b;
short c;
a = -58;
c = -315;
b = a >> 3;
Run Code Online (Sandbox Code Playgroud)
我们需要在内存中显示二进制表示a,b和c.
我已经在纸上完成了它,它给了我以下结果(在二进制补码后的数字内存中的所有二进制表示):
a = 00111010(它是一个字符,所以1个字节)
b = 00001000(它是一个字符,所以1个字节)
c = 11111110 11000101(它是一个短的,所以2个字节)
有没有办法验证我的答案?在C++中是否有一种标准方法可以在数字的内存中显示二进制表示,或者我是否必须自己编写每个步骤(计算二进制补码然后转换为二进制)?我知道后者不会花那么长时间,但我很好奇是否有一种标准的方法可以做到这一点.
我目前正在学习C++,而且我刚刚学会了增量.我知道你可以使用"++ x"进行增量,然后使用"x ++"进行增量.
不过,我真的不知道何时使用两者中的任何一个...我从来没有真正使用过"++ x",到目前为止,事情总是很好 - 所以,我什么时候应该使用它?
示例:在for循环中,何时优先使用"++ x"?
此外,有人可以确切地解释不同的增量(或减量)如何工作?我真的很感激.
我最近一直在阅读很多关于Markov Decision Processes(使用价值迭代)的内容,但我根本无法理解它们.我在互联网/书籍上找到了很多资源,但他们都使用的数学公式对我的能力来说过于复杂.
由于这是我上大学的第一年,我发现网上提供的解释和公式使用的概念/术语对我来说太复杂了,他们认为读者知道我从未听说过的某些事情. .
我想在2D网格上使用它(填充墙壁(无法实现),硬币(可取)和移动的敌人(必须不惜一切代价避免)).整个目标是收集所有硬币而不触及敌人,我想使用马尔可夫决策过程(MDP)为主要玩家创建AI .以下是它的部分外观(请注意,与游戏相关的方面在这里并不是很重要.我只是想了解一般的MDP):

根据我的理解,MDP的粗略简化是它们可以创建一个网格,它保持我们需要去的方向(指向我们需要去的地方的"箭头"网格的类型,从网格上的某个位置开始)达到某些目标并避免某些障碍.具体到我的情况,这意味着它允许玩家知道去哪个方向收集硬币并避开敌人.
现在,使用MDP术语,这意味着它创建了一个状态集合(网格),它保存某个特定状态的某些策略(要采取的操作 - >上,下,右,左)(网格上的一个位置) ).这些政策由每个州的"效用"值决定,这些价值本身是通过评估在短期和长期内获得多少益处来计算的.
它是否正确?还是我完全走错了路?
我至少想知道以下等式中的变量在我的情况中代表什么:

(取自Russell&Norvig的"人工智能 - 现代方法"一书)
我知道这s将是网格中所有方块的列表,a将是一个特定的动作(上/下/右/左),但其余的呢?
如何实施奖励和效用函数?
如果有人知道一个简单的链接,显示伪代码以非常慢的方式实现与我的情况相似的基本版本,那将是非常好的,因为我甚至不知道从哪里开始.
谢谢你宝贵的时间.
(注意:随意添加/删除标签或在评论中告诉我是否应该提供有关某些内容或类似内容的更多详细信息.)
这是一个非常简单的问题(我认为),是否有一个STL库方法提供变量类型的限制 (例如整数) ?我知道这些限制在不同的计算机上有所不同,但必须有办法让他们通过一种方法,对吗?
另外,编写一个计算变量类型限制的方法真的很难吗?
我只是好奇!:)
谢谢 ;).
我正在研究的公司正在考虑将其当前的OCR引擎(Nuance的OmniPage)转换为开源替代品,如Tesseract.
为了获得一些性能基准(执行速度和准确性)来比较两者,我得到了一个非常简单的程序,只是为了了解Tesseract 3.2 C API的执行情况.
我最初的观察(其中一些可能是关闭的,随意在评论中纠正我的解释):
style,设置元素left,right,width,height和positionHTML标记的属性,所以这个限制是次要的.如果只是其他因素,那么迁移可能没有太多问题.然而,这种性能限制是一个杀手.
然后,我心想:Tesseract与其商业同类产品相比如何表现如此糟糕?谷歌肯定会追求卓越.
所以,我几乎可以肯定这个问题来自我.我要么没有以正确的方式使用API,我也没有改变我应该或者其他我刚才缺少的设置.
以下是与Tesseract相关的测试程序部分:
#include "baseapi.h"
#include "allheaders.h"
// ...
// Tesseract initialization
tesseract::TessBaseAPI api;
api.Init("", "eng+deu+fra");
api.SetPageSegMode(tesseract::PageSegMode::PSM_AUTO_OSD);
api.SetVariable("tessedit_create_hocr", "1"); // for the hOCR output
// ...
// OCR
PIX* pixs = pixRead(image_path.c_str());
STRING result;
api.ProcessPages(image_path.c_str(), NULL, 0, &result);
// ... write the result to a file
Run Code Online (Sandbox Code Playgroud)
我尝试了不同的页面分割模式,并且没有激活特效格式的创建,只是像以前一样失望.我还尝试将一些预处理脚本应用于图像,看看它是否对检测有所帮助,但没有成功.我尝试只使用一个字典进行测试,但它对性能没有太大的影响.我在多页TIF文件和单页TIF图像方面遇到了相同的性能问题,并且还没有尝试其他格式. …
首先,我的问题并不是特定于C#或XNA,但我的代码示例将使用这些.
我目前正在尝试制作一个Pong克隆,我遇到了碰撞检测的问题.
每个对象基本上都有一个特定的速度(Vector2),Position(Vector2,也是)和Speed(只是一个浮点数).在对象的每次Update()调用中,位置都会以这种方式更改:
Velocity.Normalize();
Position += Velocity * Speed;
Run Code Online (Sandbox Code Playgroud)
首先,我只检查了两个对象之间是否存在碰撞,并且从对象的矩形进行简单的Intersects()调用.我很快意识到,我不仅可以检查对象当前是否与另一个物体发生碰撞,而是检查物体是否与物体碰撞.只检查两个物体当前是否发生碰撞,当速度过高时,球会通过桨叶.
我尝试了不同的方法来解决问题,但它们似乎都没有用.我只需要一种方法来检查两个物体是否在它们的路上相撞,如果它们是,它是从水平,垂直还是两者(相应地改变球的速度).
我不一定非常想要解决方案,也许只是如何实现它的基本思想,我将自己编写代码.
谢谢你的时间.
我正在大学学习操作系统课程,最近我们学会了如何在内存中表示浮点数.
我们的作业是关于将浮动数字float手动转换为二进制表示.
例如,在漫长的转换过程之后200,0234375会给出01000011010010000000011000000000.
其中一个问题是如何在内存中表示0.1f.所以我做了整个转换过程,最后得到了这个:
00111101110011001100110011001100
根据我们到目前为止所学到的,这是问题的正确答案(我问老师).
但是,在下一个问题上,我们被要求用程序验证答案,以查看0.1f的实际二进制表示.真正的代表是这样的:
00111101110011001100110011001101
(注意最后一点)
然后我们被要求尝试猜测为什么会发生这种情况.
我注意到0011在转换数字时的周期性,并且由于最终的下一位0将是a 1,我会假设计算机将该最终结果舍入0
到a 1,这将解释差异.
所以,我想知道的是,我是否正确?当使用尾数的23位时,计算机是否根据下一位是什么来舍入最后一位?
这是一个家庭作业,所以如果你错了,我可以简单地指导我找到答案,我会很感激.
另外,我用谷歌搜索我能想到的关键字找不到我的问题的答案.请原谅我这是否重复.
出于好奇,我想知道C++字符串文字的真正底层类型是什么.
根据我观察到的情况,我会得到不同的结果.
一个类似于以下的类型测试:
std::cout << typeid("test").name() << std::endl;
Run Code Online (Sandbox Code Playgroud)
表明了我char const[5].
尝试将字符串文字分配给不兼容的类型,如此(查看给定的错误):
wchar_t* s = "hello";
Run Code Online (Sandbox Code Playgroud)
我a value of type "const char *" cannot be used to initialize an entity of type "wchar_t *"来自VS12的IntelliSense.
但我不知道它是如何可能的,const char *因为VS12接受了以下行:
char* s = "Hello";
Run Code Online (Sandbox Code Playgroud)
我已经读过,这在C++ 11之前的标准中是允许的,因为它与C的复古兼容性,尽管修改s会导致未定义的行为.我假设这只是VS12还没有实现所有的C++ 11标准,并且这条线通常会导致错误.
阅读C99标准(从这里,6.4.5.5)表明它应该是一个数组:
然后使用多字节字符序列初始化静态存储持续时间和长度的数组,这足以包含序列.
那么,C++字符串文字下面的类型是什么?
非常感谢你宝贵的时间.
让我首先尝试解释一下我想要实现的目标。
我正在制作一款游戏,玩家可以拾取能量提升(出于某种原因,我在游戏中将其称为“战利品”)。这是我的 Loot 类的基本形式:
public class Loot : Sprite
{
//Properties and fields...
public Loot(/*parameters...*/)
{
}
public virtual OnPickUp(Player player)
{
}
}
Run Code Online (Sandbox Code Playgroud)
Player和Sprite是我的课程。这是我的问题:我的精灵类持有一个位置(Vector2,来自 XNA 的表示向量的结构),根据我对 C# 工作原理的理解,复制两个精灵将复制彼此的引用,因此,每当我更改一个位置时,它也会改变别人的。
每当一个战利品应该产生时,我有一个类保存可能产生的战利品,它返回一个随机的战利品,并且战利品被复制并显示在屏幕上,但是一旦我获得多个相同类型的战利品,它就会由于参考副本问题而混乱(两者将共享相同的位置,并且只有一个可见)。
因此,每当我需要生成新的战利品时,我都会尝试创建一个新的战利品对象,因此我必须提供一个具有多个参数的构造函数,以便以这种方式轻松复制战利品:(让我们假设 toSpawn 可以是从 Loot 类派生的任何类型,比如 HealthPack,或者其他什么)
Loot spawning = new Loot(toSpawn.Position, toSpawn.Color /*etc...*/);
Run Code Online (Sandbox Code Playgroud)
在我决定实施“OnPickUp”之前,它看起来是正确的。由于我创建了一个新的Loot对象而不是正确的子类,因此toSpawn的OnPickUp函数的功能将消失,拾取战利品最终将不执行任何操作(它只会调用基类 Loot 的空函数)。
显然,我在这里做错了什么。我没有太多的编程经验,更不用说 C# 了,所以我真的不知道如何解决这个问题。我尝试使用代表 OnPickUp 功能的 Action< Player> 对象,它可以工作,但仍然限制我很多(因为我必须将静态函数作为 Action< Player> 传递,因此限制我使用玩家的信息参数并阻止我使用子类特定信息)。
所以,最后,我的问题实际上是:什么是更好的设计,允许具有重载函数的子类,但仍然能够克隆基类及其属性?
感谢您宝贵的时间。
如果有什么不够清楚(我知道不是),那么只需在评论中询问我,我会尝试更详细地描述我的问题。
我的问题与C#函数参数有关.我习惯于C++,默认情况下参数是值,除非你明确地将它们指定为引用.那么,在C#中,如何使函数参数按值而不是按引用传递?实际上,我只想知道如何传递变量,并且在调用函数后没有修改该变量.
例如:
void foo(Widget w)
{
w.X = 3;//where w wouldn't really be modified here
}
Run Code Online (Sandbox Code Playgroud) 我知道这可能是一个非常简单的问题,但我似乎无法弄明白.首先,我想指出我确实在半小时左右的时间内查看Google和SO而没有找到我的问题的答案(是的,我很认真).
基本上,我想围绕一个点旋转一个Vector2(在我的例子中,它总是(0,0)向量).因此,我尝试使用参数作为旋转点和旋转角度(以度为单位)来创建函数.
这是一个快速绘图,展示了我正在努力实现的目标:

我想取V1(红色矢量),将其旋转角度A(蓝色),以获得新的矢量(V2,绿色).在这个例子中,我使用了一个最简单的情况:轴上的V1和90度角,但我希望该函数能够处理更多" 复杂 "的情况.
所以这是我的功能:
public static Vector2 RotateVector2(Vector2 point, float degrees)
{
return Vector2.Transform(point,
Matrix.CreateRotationZ(MathHelper.ToRadians(degrees)));
}
Run Code Online (Sandbox Code Playgroud)
那么,我做错了什么?当我运行代码并使用(0,-1)向量和90度角调用此函数时,我得到向量(1,4.371139E-08)...
另外,如果我想接受一个点作为参数旋转呢?因此旋转并不总是发生在(0,0)附近......