有一个长度为998的数组,里面是1-1000并且无重复的数。只用一次遍历,不能使用集合,算出1-1000不在这个数组中的那2个数

一次遍历求出arr[998]的998个数的平方和 和 和.
1~1000的和为:n(1+n)/21~1000的平方和为:
n(n+1)(2n+1)/6即可得到两个数的平方和 和 和
解方程即可得到结果

posted @ 2011-11-18 12:58 メmarsメ 阅读(422) | 评论 (0)编辑 收藏

非组合BCD码VS组合BCD码

计算机中的BCD码,经常使用的有两种格式,即分离BCD码,组合BCD码。
    所谓分离BCD码及未组合,即用一个字节的低四位编码表示十进制数的一位,
例如数82的存放格式为:
00001000   00000010其中_表示无关值。
     组合BCD码,是将两位十进制数,存放在一个字节中,例82的存放格式是1000 0010

       内存储器每个字节是由八位二进制的数组成,BCD码是由四位二进制的数组成。如果八位一个字节存放一个BCD码,称为未组合的BCD码,高四位为0,低四位存放一个BCD码;如果八位一个字节存放两个BCD码,称为组合的BCD码,高四位存放一个BCD码1,低四位存放另一个BCD码2。

最常用的BCD编码,就是使用"0"至"9"这十个数值的二进码来表示。这种编码方式,在中国大陆称之为“8421码”。除此以外,对应不同需求,各人亦开发了不同的编码方法,以适应不同的需求。这些编码,大致可以分成有权码和无权码两种:
有权BCD码,如:8421(最常用)、2421、5421…
无权BCD码,如:余3码、格雷码…

一、8421BCD码

  二进制编码的十进制数,简称BCD码(Binarycoded Decimal). 这种方法是用4位二进制码的组合代表十进制数的0,1,2,3,4,5,6 ,7,8,9 十个数符。4位二进制数码有16种组合,原则上可任选其中的10种作为代码,分别代表十进制中的0,1,2,3,4,5,6,7,8,9 这十个数符。最常用的BCD码称为8421BCD码,8.4.2.1 分别是4位二进数的位取值。 右图为十进制数和8421BCD编码的对应关系表:

  1、BCD码与十进制数的转换

  BCD码与十进制数的转换.关系直观,相互转换也很简单,将十进制数75.4转换为BCD码如:

  75.4=(0111 0101.0100)BCD 若将BCD码1000 0101.0101转换为十进制数如: (1000 0101.0101)BCD=85.5

  注意:同一个8位二进制代码表示的数,当认为它表示的是二进制数和认为它表示的是二进制编码的十进制数时,数值是不相同的。

  例如:00011000,当把它视为二进制数时,其值为24;但作为2位BCD码时, 其值为18。

  又例如00011100,如将其视为二进制数,其值为28,但不能当成BCD码,因为在8421BCD码中,它是个非法编码 .

  3、BCD码的加减运算

  由于编码是将每个十进制数用一组4位二进制数来表示,因此,若将这种BCD码直接交计算机去运算,由于计算机总是把数当作二进制数来运算,所以结果可能会出错。例:用BCD码求38+49。

  解决的办法是对二进制加法运算的结果采用"加6修正,这种修正称为BCD调整。即将二进制加法运算的结果修正为BCD码加法运算的结果,两个两位BCD数相加时,对二进制加法运算结果采用修正规则进行修正。修正规则:

  (1)如果任何两个对应位BCD数相加的结果向高一位无进位,若得到的结果小于或等于9,则该不需修正;若得到的结果大于9且小于16时,该位进行加6修正。

  (2)如果任何两个对应位BCD数相加的结果结果大于或等于16(即向高一位有进位),时该位进行加6修正.

  (3)低位修正结果使高位大于9时,高位进行加6修正。

  下面通过例题验证上述规则的正确性。

  用BCD码求35+21 BCD码求25+37 用BCD码求38+49 用BCD码求42+95

  用BCD码求91+83 用BCD码求94+7 用BCD码求76+45

  两个组合BCD码进行减法运算时,当低位向高位有借位时,由于"借一作十六"与"借一作十"的差别,将比正确的结果多6,所以有借位时,可采用"减6修正法"来修正.两个BCD码进行加减时,先按二进制加减指令进行运算,再对结果用BCD调整指令进行调整,就可得到正确的十进制运算结果。 实际上,计算机中既有组合BCD数的调整指令,也有分离BCD数的调整指令。另外,BCD码的加减运算,也可以在运算前由程序先变换成二进制数,然后由计算机对二进制数运算处理,运算以后再将二进制数结果由程序转换为BCD码。 

posted @ 2011-11-06 18:16 メmarsメ 阅读(4110) | 评论 (0)编辑 收藏

杂记

-128的补码不是0吗,当我用
MOV AL, -128
NEG AL;
之后,果不其然,AL结果还是80H

posted @ 2011-11-06 11:55 メmarsメ 阅读(118) | 评论 (0)编辑 收藏

VS2010去除UNICODE

项目->配置属性->C/C++->预处理器->预处理器定义->去掉继承选项

posted @ 2011-11-05 09:40 メmarsメ 阅读(987) | 评论 (0)编辑 收藏

trick

 _numTriangles = _numCellsPerRow * _numCellsPerCol * 2;
// 三角形的数目 = 横边的数目*竖边的数目*2;

// 求randfloat from lowBound to highBound
float d3d::GetRandomFloat(float lowBound, float highBound)
{
    
if( lowBound >= highBound ) // bad input
        return lowBound;

    
// get random float in [0, 1] interval
    float f = (rand() % 10000* 0.0001f

    
// return float in [lowBound, highBound] interval. 
    return (f * (highBound - lowBound)) + lowBound; 
}

posted @ 2011-11-04 13:17 メmarsメ 阅读(137) | 评论 (0)编辑 收藏

概率问题,有个人每天都去看流星,他一个月能看到流星的概率是91%,那他半个月能看到流星的概率是多少?(每天能看到流星的事件是独立的)

每天晚上出来流星出来的概率为x
则一个月不出来流星的概率为(1-x)^30=1-0.91=0.09
半个月不出来流星的概率为(1-x)^15=(1-x)^30^0.5=0.3
半个月看得到流星的概率为70%
..
每天看到流星的概率相同,天数越多,看到流星的概率越大!比如抽奖,抽的次数越多,中奖概率越大,30天91%,15天绝不是91%,70%为正解!

posted @ 2011-11-04 10:37 メmarsメ 阅读(595) | 评论 (0)编辑 收藏

VS2010嵌入汇编模块前基本配置

MASM in VisualStudio 2010

 

First step:

 

Create an empty project in Visual C++:


Second, right-click project in solutionexplorer, Build customizations, tick "masm",

 


Then tap the right of mouse, select Add


Now, select C++ File(.cpp), enter the sourcefile name with .asm as extend file name.


Tap right of mouse, choose Properties:


Expand the entry under ConfigurationProperties. Then expand the entry named Microsoft Macro Assembler.


Notice that the Include Paths option hasbeen set to the x:\file directory\include directory.

In this example, include directory isc:\Irvine.


Next, select the Listing File entry, also in theMicrosoft Macro Assembler group. Notice that the Assembled Code Listing Fileentry (shown below) has been assigned a macro name (starting with $) thatidentifies the name of the source input file, with a file extension of .lst.So, if your program were named main.asm, the listing file would be namedmain.lst:


Find the Linker entry under ConfigurationProperties. Select the Input entry, and notice that two filenameshave been added to the Additional Dependencies entry. The user32.libfile is a standard MS-Windows file. The irvine32.lib file is the linklibrary file supplied with this book. There must be at least one spaceseparating the file names:


Next, select Linker underConfiguration Properties, and then select General. The AdditionalLibrary Directories option equals c:\Irvine, so the linker can findthe Irvine32.lib library file(you also can copy irvine32.lib to .../VC/LIB direcotry, so this would needn't to be done):


Select Linker under the ConfigurationProperties and select Debugging. Notice that the Generate DebugInfo option is set to Yes:


Select System under the Linkerentry. Notice that the SubSystem option has been set to Console:


We use the Console settingbecause it is easy for assembly language programs to write output to a textconsole (Command) window. This is the window you see when running cmd.exe fromthe Start > Run menu in Windows.

Click the OK button to close theProject Property Pages window.

posted @ 2011-11-02 13:00 メmarsメ 阅读(1294) | 评论 (0)编辑 收藏

磁盘的磁道(track)

  • 以前见到的很多磁道的示意图都是这样的:注意标线的位置,“指向一条线”,我当时的理解好像是这条线就是磁道。还有的解释是说磁道就是一个“同心圆”的集合

那么,我的疑问就是,既然那条线是同心圆,那么两条线之间的那快空白是什么呀? 什么也不是? 空着的? 就是为了分开磁道?晕倒。那这浪费的部分也太多了吧。毕竟两条线中间部分的宽度看起来比磁道可实在是宽太多了。

  • 后来,查了下别的图片,才发现磁道原来应该是这样子的:不是“同心圆”,应该是“同心圆环”

 

 

到此,我关于磁道的疑问才终于有了答案。 汗自己一个!!!

 

后来又联想到了其他的问题:

每个磁道上的扇区数目是一样的么?

  • 早期的磁盘每个磁道上的扇区数目是一样,限制了磁盘的容量;后来为了增大磁盘容量采用了新技术,也就是说越往外每磁道扇区数目越多
  • 早期的硬盘是每个磁道有相同的扇区,但是现在的硬盘采用线性寻址,所以每个磁道上扇区数不一样,外面的多,里面的少.光盘跟硬盘差不多.但是用螺线的.不像硬盘采用同心圆
  • 不过,还是可以用CHS(柱面,磁道,扇区)的方式来定位, 因为IDE磁盘做了内部转换,让你看起来好像每条磁道上面的簇数量都是一样的

0磁道是在磁盘的外圈还是内圈

  • 由于历史原因 , 磁盘的0磁道在最外圈(过去的老式硬盘,每条磁道上的簇的数量都是一样多的。也就是说最里面和最外面的磁道的簇的数目是一样的。显然,磁密度越低,数据的安全越有保障。而MBR放在0柱面的,第0个磁道的,第1个簇上面,为了这个关键数据的安全,所以磁道要从最外开始安排。)
  • 但是,光盘的0磁道和磁盘,软盘刚好向盘,光盘的0磁道是在最内圈的

尽管扇区是能独立寻址的最小单位,但资源分配的最小单位是簇

  • 所以文件的大小和文件所占用的磁盘空间是不同的。所占用的磁盘空间往往多余文件的大小

硬盘簇的大小设为多少才合适

  • 默认的情况下,在格式化的时侯如果没有指定簇的大小,那么系统会根据分区的大小选择默认的簇值
  • 其实在NTFS文件系统中格式化的时候,可以在“Format”命令后面添加“/a:UnitSize”参数来指定簇的大小,UnitSize表示簇大小的值,NTFS支持512/1024/2048/4096/8192/16K/32K/64KB
  • 在NTFS文件系统中,簇的大小会影响到磁盘文件的排列,设置适当的簇大小可以减少磁盘空间丢失和分区上碎片的数量。如果簇设置过大,会影响到磁盘存储效率;反之如果设置过小,虽然会提高利用效率,但是会产生大量磁盘碎片.

posted @ 2011-10-29 21:10 メmarsメ 阅读(412) | 评论 (0)编辑 收藏

error C2443: 操作数大小冲突

#include "stdafx.h"
int Abs( int i ){
   
 _asm     mov eax, i;
    _asm or  eax, eax;
    _asm jge EXIT;
    _asm neg eax;
    _asm mov i, eax;
EXIT:    
return i;
    
}

int main(){
    
int a = -1;
    cout 
<< Abs( a << endl;

}


ax换成eax

posted @ 2011-10-25 21:14 メmarsメ 阅读(1204) | 评论 (0)编辑 收藏

无法解析的外部符号:error LNK2019

1>terrain.obj : error LNK2019: 无法解析的外部符号 "float __cdecl d3d::Lerp(float,float,float)" (?Lerp@d3d@@YAMMMM@Z),该符号在函数 "public: float __thiscall Terrain::getHeight(float,float)" (?getHeight@Terrain@@QAEMMM@Z) 中被引用
1>terrainDriver.obj : error LNK2019: 无法解析的外部符号 "bool __cdecl d3d::InitD3D(struct HINSTANCE__ *,int,int,bool,enum _D3DDEVTYPE,struct IDirect3DDevice9 * *)" (?InitD3D@d3d@@YA_NPAUHINSTANCE__@@HH_NW4_D3DDEVTYPE@@PAPAUIDirect3DDevice9@@@Z),该符号在函数 _WinMain@16 中被引用


解决方案:将Lerp定义复制到.h文件中,重新运行一下,若还是出错,再拷贝回来。
由于该加的.lib文件都加上了,所以还出现这种错误就是编译器的原因,具体不甚了解.
一般无法解析的外部符号都是因为.lib文件没有包含或者对应函数没有实现定义,如果还是出错的话,那就重新编写一遍,因为可能是拷贝过来的文件,编译器有些问题。

posted @ 2011-10-25 13:29 メmarsメ 阅读(2073) | 评论 (0)编辑 收藏

仅列出标题
共5页: 1 2 3 4 5 
<2011年10月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

导航

统计

常用链接

留言簿

随笔分类

随笔档案

文章分类

文章档案

搜索

最新评论

阅读排行榜

评论排行榜