源码补齐
① 小数和分数的原码&补码怎么做啊
一、小数部分的原码和补码可以表示为两个复数的分子和分母,然后计算二进制小数系统,根据下面三步的方法就会找出小数源代码和补码的百位形式。
37/64=100101B/2^6=0.100101B
-51/128=110011B/2^7=0.0110011B
二、将十进制十进制原始码和补码转换成二进制十进制,然后根据下面三步的方法求出十进制源代码和补码形式。一个
0.375=0.011B
0.5625=0.1001B
三、二进制十进制对应的原码和补码
[37/64]源代码=[0.100101B]源代码=00100101B
[-51/128]源代码=[0.0110011b]源代码=10110011B
[0.375]原码=[0.011b]原码=00110000B
[0.5625]源代码=[0.1001B]源代码=01001000B
[37/64]补体=[0.100101B]补体=00100101B
[-51/128]补体=[0.0110011b]补体=11001101B
[0.375]补码=[0.011b]补码=00110000B
[0.5625]补体=[0.1001B]补体=01001000B
(1)源码补齐扩展阅读:
原码、逆码、补码的使用:
在计算机中对数字编码有三种方法,对于正数,这三种方法返回的结果是相同的。
+1=00000001[原码]=00000001[逆码]=00000001[补码]
对于这个负数:
对计算机来说,加、减、乘、除是最基本的运算。有必要使设计尽可能简单。如果计算机能够区分符号位,那么计算机的基本电路设计就会变得更加复杂。
负的正数等于正的负数,2-1等于2+(-1)所以这个机器只做加法,不做减法。符号位参与运算,只保留加法运算。
(1)原始代码操作:
十进制操作:1-1=0。
1-1=1+(-1)=00000001[源代码]+10000001[源代码]=10000010[源代码]=-2。
如果用原代码来表示,让符号位也参与计算,对于减法,结果显然是不正确的,所以计算机不使用原代码来表示一个数字。
(2)逆码运算:
为了解决原码相减的问题,引入了逆码。
十进制操作:1-1=0。
1-1=1+(-1)=00000001[源代码]+10000001[源代码]=00000001[源代码]+11111110[源代码]=11111111[源代码]=10000010[源代码]=-0。
使用反减法,结果的真值部分是正确的,但在特定的值“0”。虽然+0和-0在某种意义上是相同的,但是0加上符号是没有意义的,00000001[源代码]和10000001[源代码]都代表0。
(3)补充操作:
补语的出现解决了零和两个码的符号问题。
十进制运算:1-1=0。
1-1=1+(-1)=00000001[原码]+10000001[原码]=00000001[补码]+11111111[补码]=00000000[补码]=00000000[原码]=0。
这样,0表示为[00000000],而之前的-0问题不存在,可以表示为[10000000]-128。
(-1)+(-127)=10000001[源代码]+11111111[源代码]=11111111[补充]+10000001[补充]=1000000[补充]=-128。
-1-127的结果应该是-128。在补码操作的结果中,10000000[补码]是-128,但是请注意,由于-0的补码实际上是用来表示-128的,所以-128没有原码和逆码。(-128的补码表10000000[补码]计算出的00000000[原码]是不正确的)。
② php数字字符串左侧补0、字符串填充和自动补齐的几种方法
一、数字补0.
如果要自动生成学号,自动生成某某编号,就像这样的形式“d0000009”、“d0000027”时,那么就会面临一个问题,怎么把左边用0补齐成这样8位数的编码呢?我想到了两种方法实现这个功能。
方法一:
先构造一个数字10000000,千万,也就是一个1,7个0,然后加上当前的编号(比如是3),那么就得到
10000003,用字符串截取
substr('10000003',1,7)后就得到0000003,最后在与“d”拼接,就得到了最终的编号d0000003。
源码如下:
复制代码
代码如下:
<?php
$num
=
3;
$temp_num
=
10000000;
$new_num
=
$num
+
$temp_num;
$real_num
=
"d".substr($new_num,1,7); //即截取掉最前面的“1”
echo
$real_num;
?>
方法二:
测出当前编号(比如是3)的长度strlen('3')=1,用要生成编号的总长度减去当前编号长度,得到需要填充0的个数,然后再用for循环填充0即可。
源码如下:
复制代码
代码如下:
<?php
$num
=
3;
$bit
=
7;//产生7位数的数字编号
$num_len
=
strlen($num);
$zero
=
'';
for($i=$num_len;
$i<$bit;
$i++){
$zero
.=
"0";
}
$real_num
=
"d".$zero.$num;
echo
$real_num;
?>
方法三:另外几种方法
复制代码
代码如下:
<?php
$sourceNumber
=
"1";
$newNumber
=
substr(strval($sourceNumber+1000),1,3);
echo
"$newNumber";
?>
/*这个时候就会出现:001
如果要增加位数的话可以将1000加大,然后把3也加大。
举例:如果我要补上
"4个0"
第03行
就要变成这样。*/
复制代码
代码如下:
<?php
$newNumber
=
substr(strval($sourceNumber+100000),1,5);
?>
/*其实就是总共要显示几位数字,就把$sourceNumber+1后面补上多少个0,最后一个数字就直接改成显示几位数字。*/
复制代码
代码如下:
/*string
str_pad
(
string
$input,
int
$pad_length
[,
string
$pad_string
[,
int
$pad_type]]
)*/
<?php
$input
=
"Alien";
echo
str_pad($input,
10);
//
proces
"Alien
"
echo
str_pad($input,
10,
"-=",
STR_PAD_LEFT);
//
proces
"-=-=-Alien"
echo
str_pad($input,
10,
"_",
STR_PAD_BOTH);
//
proces
"__Alien___"
echo
str_pad($input,
6
,
"___");
//
proces
"Alien_"
?>
/*补齐字符串的长度.以pad_string
补.默认补在右边,如果STR_PAD_LEFT就补到左边,STR_PAD_BOTH两边一起补。下次用str_pad,毕竟是内置的,肯定比自定义的快。*/
复制代码
代码如下:
/*
你上面的方法我觉得不怎么好,介绍一下我写的一个方法。方法函数如下,这样当你要的结果001的话,方法:dispRepair('1',3,'0')
功能:补位函数
str:原字符串
type:类型,0为后补,1为前补
len:新字符串长度
msg:填补字符
*/
function
dispRepair($str,$len,$msg,$type='1')
{
$length
=
$len
-
strlen($str);
if($length<1)return
$str;
if
($type
==
1)
{
$str
=
str_repeat($msg,$length).$str;
}
else
{
$str
.=
str_repeat($msg,$length);
}
return
$str;
}
二、字符串填充、自动补齐、自动补全
遇到要输出一定长度字符串的时候,可以使用一下两种方法进行PHP字符串自动填充、自动补全
。
方法一:
复制代码
代码如下:$newStr=
sprintf('%05s',
$str);
sprintf()的功能非常灵活,上面的格式字符串中,“%05s
”表示输出成长度为5的字符串,如果长度不足,左边以零补全;如果写成
“%5s
”,则默认以空格补全;如果希望使用其它字符补全,则要在该字符前加上单引号,即形如“%'#5s
”的表示以井号补全;最后,如果希望补全发生在
字符串右边,则在百分号后加上减号,“%-05s
”。
方法二:
[code]$cd_no
=
str_pad(++$next_cd_no,8,'#',STR_PAD_LEFT);
str_pad(string,length,pad_string,pad_type):具体用法查看手册。
string
必需。规定要填充的字符串。
length
必需。规定新字符串的长度。如果该值小于原始字符串的长度,则不进行任何操作。
pad_string
可选。规定供填充使用的字符串。默认是空白。
pad_type
可选。规定填充字符串的那边。
这两种方法很方便的实现了PHP字符串的自动补全功能。
③ eclipse用来补全代码的快捷键
1、在“触发代码提示”允许的范围之内,空格键和回车键就是快捷键。
2、补全代码功能需设置“Auto Activation triggers for java”。
3、“Auto Activation triggers for java”这个选项就是指触发代码提示的的选项,把“.”改成“.abcdefghijklmnopqrstuvwxyz(”的意思,就是指遇到26个字母和“.与(”这些符号就触发代码提示功能了。
4、代码提示选项补充完整后,输入关键字即可得到提示功能,得到提示功能后,回车键与空格键就是所谓的“快捷键”了。
5、触发代码提示设置方法大概可分为六个步骤,具体如下:
(1)、打开Eclipse,在菜单栏中找到Window;
④ source insight 编写C代码中结构体变量赋值无法联想
SI有这个功能,
就是输入一个结构体变量,系统会以下拉菜单的形式显示出其所有成员,不光是结构体,其他变量如枚举,已定义的函数等等,系统都会自动匹配并以下来菜单的形式显示出来。
只要你输入前几个字母,系统都会提示出已定义的变量,使用非常方便。
打开这个功能的方法:
点击Options->Preferences,在弹出的对话框中找到Typing,并点击,在下面找到Use automatic symbol completion window,在前面点上对话,就开启了符号自动补齐功能。
差点忘了,还有一个地方需要设置,
点击Options->Document Optons,然后找到Allow auto-complete,也打上对话,
这样这个功能就开启啦,
一共两个地方需要设置,少一个好像都不好使。
⑤ #pragma的用法
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作。#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的情况下,给出主机或操作系统专有的特征。依据定义,编译指示是机器或操作系统专有的,且对于每个编译器都是不同的。
其格式一般为: #Pragma Para
其中Para 为参数,下面来看一些常用的参数。
(1)message 参数。 Message 参数是我最喜欢的一个参数,它能够在编译信息输出窗
口中输出相应的信息,这对于源代码信息的控制是非常重要的。其使用方法为:
#Pragma message(“消息文本”)
当编译器遇到这条指令时就在编译输出窗口中将消息文本打印出来。
当我们在程序中定义了许多宏来控制源代码版本的时候,我们自己有可能都会忘记有没有正确的设置这些宏,此时我们可以用这条指令在编译的时候就进行检查。假设我们希望判断自己有没有在源代码的什么地方定义了_X86这个宏可以用下面的方法
#ifdef _X86
#Pragma message(“_X86 macro activated!”)
#endif
当我们定义了_X86这个宏以后,应用程序在编译时就会在编译输出窗口里显示“_
X86 macro activated!”。我们就不会因为不记得自己定义的一些特定的宏而抓耳挠腮了
。
(2)另一个使用得比较多的pragma参数是code_seg。格式如:
#pragma code_seg( ["section-name"[,"section-class"] ] )
它能够设置程序中函数代码存放的代码段,当我们开发驱动程序的时候就会使用到它。
(3)#pragma once (比较常用)
只要在头文件的最开始加入这条指令就能够保证头文件被编译一次,这条指令实际上在VC6中就已经有了,但是考虑到兼容性并没有太多的使用它。
(4)#pragma hdrstop表示预编译头文件到此为止,后面的头文件不进行预编译。BCB可以预编译头文件以加快链接的速度,但如果所有头文件都进行预编译又可能占太多磁盘空间,所以使用这个选项排除一些头文件。
有时单元之间有依赖关系,比如单元A依赖单元B,所以单元B要先于单元A编译。你可以用#pragma startup指定编译优先级,如果使用了#pragma package(smart_init) ,BCB就会根据优先级的大小先后编译。
(5)#pragma resource "*.dfm"表示把*.dfm文件中的资源加入工程。*.dfm中包括窗体
外观的定义。
(6)#pragma warning( disable : 4507 34; once : 4385; error : 164 )
等价于:
#pragma warning(disable:4507 34) // 不显示4507和34号警告信息
#pragma warning(once:4385) // 4385号警告信息仅报告一次
#pragma warning(error:164) // 把164号警告信息作为一个错误。
同时这个pragma warning 也支持如下格式:
#pragma warning( push [ ,n ] )
#pragma warning( pop )
这里n代表一个警告等级(1---4)。
#pragma warning( push )保存所有警告信息的现有的警告状态。
#pragma warning( push, n)保存所有警告信息的现有的警告状态,并且把全局警告
等级设定为n。
#pragma warning( pop )向栈中弹出最后一个警告信息,在入栈和出栈之间所作的
一切改动取消。例如:
#pragma warning( push )
#pragma warning( disable : 4705 )
#pragma warning( disable : 4706 )
#pragma warning( disable : 4707 )
//.......
#pragma warning( pop )
在这段代码的最后,重新保存所有的警告信息(包括4705,4706和4707)。
(7)pragma comment(...)
该指令将一个注释记录放入一个对象文件或可执行文件中。
常用的lib关键字,可以帮我们连入一个库文件。
#pragma pack(1) 作用
主要用来设置结构定义的字节对齐方式,比如是单字节对齐,双字节对齐等,比如如果是双字节对齐,那么结构的成员变量的地址必须是2的整数倍,这就造成了字节补齐,但是提高了访问速度。单字节呢,就是没有补齐,成员变量的地址是连续的,其他依次类推,通常是4,8等。通常用于网络传输数据,特别是传输整个结构时,必须采取单字节对齐,这样才可以直接把结构地址,以及结构长度,作为Send的参数发送整个结构,否则只能依次发送结构的成员,要不然会出现结构解释的差异。
另外,在Project->Setting->C/C++->Code Generation->Struct member alignment中可以设置结构的对齐方式。
传输结构时和pack无关,只要Recv端定义的结构和Send方一样就没问题了。
pack多用于Hook程序,比如Hook Api技术,因为需要硬编码,所以必须将结构
压缩,将内容补齐!
比如:
ASM_STRUCT{
BYTE bJmp;
DWORD dwDes;
}a;
如果不用Pack时,编译为:
a.bJmp = 0xEB; // jmp的编码
a.dwDes = 0x00410123; // jmp 0x00410123
不用pack的话,内存内容为 0xEB XX XX XX 23 01 41 00 // 共8BYTE
其中XX为不定值,用pack后 0xEB 23 01 41 00 // 共5BYTE
这样,在Hook时运行这些指令,就必须用#parama pack(1) // 1 BYTE方式对齐。
如果直接把结构地址,以及结构长度,作为Send的参数发送整个结构,难道不需要pack吗?请教verybigbug()兄
不需要。
send(struct, sizeof(struct));就可以了,如果两个程序都没有pack的话,
相同的结构体在接收数据时就没有问题。必须保证两边的pack都是一样才行。
我在写socket的程序(SDK方式)时送结构就从来不用pack的。
只在写Hook Api时才用pack(1)。
#pragma comment(lib, "ws2_32") 是什么意思 ???
.就相当于你将ws2_32.lib包含到工程中去。这样你就可以使用DLL接口函数了
#pragma data_seg 是什么意思??
用#pragma data_seg建立一个新的数据段并定义共享数据,其具体格式为:
#pragma data_seg ("shareddata")
HWND sharedwnd="NULL";//共享数据
#pragma data_seg() // 再windows 核心编程思想中有很多地方用到。
⑥ 求助大神,WRF安装编译时出错,放上log部分求帮助解决
WRF最初的安装步骤,适合初学者
WRF(Weather Research and Forecasting Model),是由美国国家大气研究中心(NCAR)和美国国家海洋和大气管理局(NOAA)共同开发的数值模式。
该模式运行于linux或UNIX之类的环境下;或者在windows系统下安装虚拟机,虚拟linux环境进行编译运行。
像大多数linux下的开源软件,官方发布的WRF是源码包,需要先编译才能够生成可执行文件进而运行模式。
以下是从下载到编译的最初步骤。
工具/原料
linux(或UNIX、AIX)之类系统的电脑或服务器一台(需已安装NETCDF)
方法/步骤
1
如果你自己安装了linux系统,这一步可以直接跳过;
如果你知道如何通过xmanager或其他ssh工具连接到自己能够访问的linux服务器,这一步可以跳过。
如果你既没有自己的linux系统,又不会使用ssh工具连接已有的linux(UNIX/AIX)服务器,这一步是必须看的。
以xmanager为例(软件请自行搜索下载)
安装完成后运行Xshell,点击新建(如图)
在Host处填入服务器地址,User Name和Password处分别填入你的账号和密码,点击确定。
选择刚刚添加好的服务器,点击Connect,成功连接服务器。
2
下载WRF安装包,和WRF的预处理系统WPS(必需)的安装包。
首先访问网址:
http://www2.mmm.ucar.e/wrf/users/download/get_source.html
如果是第一次登陆,点击New Users,否则选Returnning Users。
3
若选了New Users,填写注册信息:
4
点击下一步。
5
下载WRF和WPS源码包(.tar格式)。
6
下载WPS需要的地理数据包,第二列解压后约49G,如果磁盘空间紧张,选第三列(如图)。
7
至此,下载完成,以下将下载好的三个压缩包上传到服务器自己可以访问的目录下。(自己电脑为linux系统的跳过)
8
回到Xshell,点击图示图标,打开Xftp。
Xftp界面下,左侧找到压缩包,拖动到右侧即可。
以下斜体为Xshell(或linux shell)中输入的命令!!
Xshell中,进入压缩包所在的目录,输入:tar zxvf WRFV3.6.TAR.gz
或者某些系统中需要分两条命令:gunzip WRFV3.6.TAR.gz 然后 tar xvf WRFV3.6.TAR。
(小技巧,文件名不需要输全,输入头几个字母,按下Tab键,会自动补齐)
生成WRFV3目录,ls如下:
WPS 和地理数据用同样的方法解压(tar zxvf WPSV3.6.TAR.gz)。其中地理数据在运行模式的时候才需要,编译安装用不到,因此本文不讲。
cd WRFV3,进入WRF目录,
ls 查看目录内容
其中,configure clean compile三个文件为可执行文件。
以下开始编译WRF
./configure
输入数字后回车,选择所用的fortran 和c编译器(WRF代码由fortran和c语言写成)。图中我用的是AIX系统,用的IBM自己的xlf 和xlc编译器。
其中serial是单线程运算,运算速度慢,但是编译简单,一般不用,初次接触可尝试。
dmpar是分布内存式并行,相当于多台电脑组成cluster,每个cpu都有自己的内存。
smpar是共享内存式并行,相当于服务器中内存和cpu不在一起。
自己具体情况咨询服务器管理员,如果是自己的PC,选smpar。
接下来输入数字选择模式区域是否嵌套一般选1.
至此configure完成。
configure的作用是生成configure.wrf文件,告诉接下来的compile过程:使用哪些编译器,编译器在哪儿,以及编译过程中使用的工具都在哪,编译使用哪些编译参数等等等。
一般configure都能完成,接下来就是compile,也就是编译过程。
输入命令:
./compile wrf
或者如果你要模拟实际个例,输入:
./compile em_real
这一过程一般需要花半小时或更久;还有可能发生各种问题,相应问题需要自己google或者上论坛咨询。一般需要修改 configure.wrf的内容。另外记得编译不成功的话,需要 ./clean 删除上一次编译生成的中间文件。祝你好运。
如果正常完成,会在main目录下生成 wrf.exe,如果是编译的em_real,还会生成real.exe。
至此WRF编译完成。
以下开始编译WPS。
首先进入WPS目录:
类似的:
./configure
然后选择是否需要并行和是否支持GRIB2格式。这个并行于WRF的并行是独立的,互不影响。GRIB2格式看自己的资料而定。一般不支持GRIB2的话编译出问题的可能性小一些。
完成后会生成configure.wps。其中WRF_DIR标识了WRF的目录,需要WRF正确编译了,并且路径正确指定才可以。
接下来是编译WPS
./compile
正常完成的话会在WPS目录下生成geogrid.exe ungrib.exe 和 metgrid.exe 三个文件(其实是三个链接,比如geogrid.exe是实际存在于geogrid/src/geogrid.exe。是否正常完成编译以源文件是否存在为准)。
另外,util目录下会生成若干工具(详见README文件)。如果某些不能正常生成,也不会影响以后的运行WRF。
至此,当你有了:
WPS/目录下的 geogrid.exe ungrib.exe 和 metgrid.exe
WRFV3/main/目录下的wrf.exe 和real.exe
你就完成了WRF的基本编译安装,可以愉快的进行下一个步骤:进行模拟运算了。
⑦ c语言五子棋代码,
package day17.gobang;
import java.util.Arrays;
public class GoBangGame {
public static final char BLANK='*';
public static final char BLACK='@';
public static final char WHITE='O';
public static final int MAX = 16;
private static final int COUNT = 5;
//棋盘
private char[][] board;
public GoBangGame() {
}
//开始游戏
public void start() {
board = new char[MAX][MAX];
//把二维数组都填充‘*’
for(char[] ary: board){
Arrays.fill(ary, BLANK);
}
}
public char[][] getChessBoard(){
return board;
}
public void addBlack(int x, int y) throws ChessExistException{
//@
//char blank = '*';
//System.out.println( x +"," + y + ":" + board[y][x] + "," + BLANK);
if(board[y][x] == BLANK){// x, y 位置上必须是空的才可以添棋子
board[y][x] = BLACK;
return;
}
throw new ChessExistException("已经有棋子了!");
}
public void addWhite(int x, int y)
throws ChessExistException{
if(board[y][x] == BLANK){// x, y 位置上必须是空的才可以添棋子
board[y][x] = WHITE;
return;
}
throw new ChessExistException("已经有棋子了!");
}
//chess 棋子:'@'/'O'
public boolean winOnY(char chess, int x, int y){
//先找到y方向第一个不是 blank的棋子
int top = y;
while(true){
if(y==0 || board[y-1][x]!=chess){
//如果y已经是棋盘的边缘, 或者的前一个不是chess
//就不再继续查找了
break;
}
y--;
top = y;
}
//向回统计所有chess的个数,如果是COUNT个就赢了
int count = 0;
y = top;
while(true){
if(y==MAX || board[y][x]!=chess){
//如果找到头 或者 下一个子不是chess 就不再继续统计了
break;
}
count++;
y++;
}
return count==COUNT;
}
//chess 棋子:'@'/'O'
public boolean winOnX(char chess, int x, int y){
//先找到x方向第一个不是 blank的棋子
int top = x;
while(true){
if(x==0 || board[y][x-1]!=chess){
//如果x已经是棋盘的边缘, 或者的前一个不是chess
//就不再继续查找了
break;
}
x--;
top = x;
}
//向回统计所有chess的个数,如果是COUNT个就赢了
int count = 0;
x = top;
while(true){
if(x==MAX || board[y][x]!=chess){
//如果找到头 或者 下一个子不是chess 就不再继续统计了
break;
}
count++;
x++;
}
return count==COUNT;
}
//chess 棋子:'@'/'O'
public boolean winOnXY(char chess, int x, int y){
//先找MAX向第一个不是 blank的棋子
int top = y;
int left = x;
while(true){
if(x==0 || y==0 || board[y-1][x-1]!=chess){
//如果x已经是棋盘的边缘, 或者的前一个不是chess
//就不再继续查找了
break;
}
x--;
y--;
top = y;
left=x;
}
//向回统计所有chess的个数,如果是COUNT个就赢了
int count = 0;
x = left;
y = top;
while(true){
if(x==MAX || y==MAX || board[y][x]!=chess){
//如果找到头 或者 下一个子不是chess 就不再继续统计了
break;
}
count++;
x++;
y++;
}
return count==COUNT;
}
//chess 棋子:'@'/'O'
public boolean winOnYX(char chess, int x, int y){
//先找到x方向第一个不是 blank的棋子
int top = y;
int left = x;
while(true){
if(x==MAX-1 || y==0 || board[y-1][x+1]!=chess){
//如果x已经是棋盘的边缘, 或者的前一个不是chess
//就不再继续查找了
break;
}
x++;
y--;
top = y;
left=x;
}
//向回统计所有chess的个数,如果是COUNT个就赢了
int count = 0;
x = left;
y = top;
while(true){
if(x==0 || y==MAX || board[y][x]!=chess){
//如果找到头 或者 下一个子不是chess 就不再继续统计了
break;
}
count++;
x--;
y++;
}
return count==COUNT;
}
public boolean whiteIsWin(int x, int y) {
//在任何一个方向上赢了,都算赢
return winOnY(WHITE, x, y) ||
winOnX(WHITE, x, y) ||
winOnXY(WHITE, x, y) ||
winOnYX(WHITE, x, y);
}
public boolean blackIsWin(int x, int y) {
return winOnY(BLACK, x, y) ||
winOnX(BLACK, x, y) ||
winOnXY(BLACK, x, y) ||
winOnYX(BLACK, x, y);
}
}
⑧ 我的RedHat Linux系统下怎么没有./configure命令啊,其主要是我想装下Oracle,望哪位大哥帮我解决一下
./configure不是命令,是当前目录下的一个可执行文件。
你运行一下那个runInsta...文件试试
./runIn 后面tab补齐