我正在尝试进行测试,以判断我的PC是通过右移十六进制FFFFFFFF来执行算术或逻辑右移1.
我知道整数-1读取为FFFFFFFF十六进制,因为它是二进制的补码1.-1通过1结果右移FFFFFFFF并显示PC执行算术右移.
但是,如果我只是输入0xFFFFFFFF >> 1,它会导致7FFFFFFF并显示PC执行逻辑右移.为什么会这样?请参阅以下产生结果的代码:
#include <stdlib.h>
#include <stdio.h>
int main ( int argc, char *argv[] )
{
printf ( "%x >> 1 = %x\n", -1, -1 >> 1 );
printf ( "%x >> 1 = %x\n", 0xffffffff, 0xffffffff >> 1 );
return EXIT_SUCCESS;
}
Run Code Online (Sandbox Code Playgroud)
该计划的输出是:
ffffffff >> 1 = ffffffff
ffffffff >> 1 = 7fffffff
Run Code Online (Sandbox Code Playgroud) 这只是基于"Feynman物理学讲座"第6-3节的实验:
在最简单的版本中,我们想象一个"游戏",其中"玩家"从点x = 0开始,并且在每次"移动"时需要向前(向+ x)或向后(向-x)迈出一步.选择是随机进行的,例如通过掷硬币来确定.
资料来源:http://www.feynmanlectures.caltech.edu/I_06.html#Ch6-S3
我的目标是计算距离说明点的预期距离.所以,我想每一步都等于一个距离单位.我写了一个简单的C程序来模拟30个随机步骤,然后计算起点的最终距离.重复一百万次,程序平均距离以获得预期距离.
理论上,预期距离应该是步数的平方根.那应该是sqrt(30)= 5.48.
但是,该程序运行几次并保持返回接近4.33的值(更确切地说,4.33461,4.33453和4.34045).为什么它甚至不接近理论值约5.48?
这是我的代码:
#include <time.h>
#include <stdlib.h>
#include <stdio.h>
int main ( int argc, char *argv[] )
{
int number_of_steps = 30;
int repetition = 1000000;
int distance = 0;
int total_distance = 0;
double expected_distance;
int i, j;
srand(time(NULL));
for ( i = 0; i < repetition; i++ ) {
for ( j = 0; j < number_of_steps; j++) {
distance += rand() & 1 ? -1 : …Run Code Online (Sandbox Code Playgroud) 有没有办法将货币字符串转换为浮动值,例如:
$1,138.15
$ 29.10
$2,195.34
Run Code Online (Sandbox Code Playgroud)
应转换为:
1138.15
29.10
2195.34
Run Code Online (Sandbox Code Playgroud)
某些货币字符串在美元符号和美元价值之间有空格.
我这样做是因为我从PDF中提取成本值(转换为txt文件)并对它们进行算术运算.例如,文本文件的一部分如下所示:
Fixed Power
$1,138.15
General Admin Surcharge
$ 29.10
Customer Charge
$2,195.34
Run Code Online (Sandbox Code Playgroud)
我的代码看起来像这样:
$sourceFile = Get-Content $sourcePath\$($filenames[0]).txt
$fixedPower = $sourceFile[(
Select-String `
-Path $sourcePath\$($filenames[0]).txt `
-Pattern "Fixed Power" `
-List
).LineNumber + 1]
$generalAdminSurcharge = $sourceFile[(
Select-String `
-Path $sourcePath\$($filenames[0]).txt `
-Pattern "General Admin Surcharge" `
-List
).LineNumber + 1]
$customerCharge = $sourceFile[(
Select-String `
-Path $sourcePath\$($filenames[0]).txt `
-Pattern "Customer Charge" `
-List
).LineNumber + 1]
Run Code Online (Sandbox Code Playgroud)
但那些只将成本提取到字符串值中.
假设*ptr指向一个变量.这是什么*ptr,&ptr以及ptr各是什么意思?
很多时候,我对它们感到困惑.有人介意澄清这些陈述并给出一些具体的例子吗?
PowerShell 应该打印所有带有前导零的 16 位二进制数,如下所示:
0000000000000000
0000000000000001
0000000000000010
0000000000000011
...
1111111111111100
1111111111111101
1111111111111110
1111111111111111
Run Code Online (Sandbox Code Playgroud)
我当前的代码如下所示:
0 .. 65535 | % { "{0:D16}" -f [int64][convert]::ToString($_,2) }
Run Code Online (Sandbox Code Playgroud)
但我想知道是否还有其他算法可以更快地执行任务。
好吧,假设你试图穿过迷宫的"北边",你会回到同一个迷宫,但在"南边".有点喜欢在迷宫球体中航行.
是否有可能生成并解决这样的迷宫?我还没有找到关于这个主题的文件......
鉴于声明:
char message[] = "hello, world"
Run Code Online (Sandbox Code Playgroud)
为什么那些打印出相同的结果?
printf ( "%s", message );
printf ( "%s", &message[0] );
Run Code Online (Sandbox Code Playgroud)
我所知道的是,%s只读取字符串的第一个地址.char message[]也被声明为char strings(char *message)的指针,并且message只读取字符串的第一个地址.但是,对于message[0],也被读作*(message + 0)并且我纠正它是这样的吗?
&message[0]= &*(message + 0)= &*message=message
假设我从这里使用dictionary.txt(单词词典),这个C代码产生如下数据:
#include <stdio.h>
int main ( void )
{
FILE *dictionary = fopen ( "dictionary.txt", "r" );
char entry[46];
unsigned value = 0;
while ( fscanf ( dictionary, "%s", entry ) != EOF ) {
for ( int i = 0; entry[i]; ++i )
value += entry[i];
printf ( "%d"\n", value );
value = 0;
}
fclose ( dictionary );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这段代码的作用是,对于字典中的每个单词,它产生一个值,该值是每个字母的所有ASCII值的总和.
编译之后,我创建了一个收集终端上所有值的data.txt:
$ ./dictionary > data.txt
Run Code Online (Sandbox Code Playgroud)
在MATLAB上:
fileID = fopen ( 'data.txt', 'r' );
formatSpec …Run Code Online (Sandbox Code Playgroud) 或者更确切地说,为什么(= 1e16 (- 1e16 1))返回真实?我怎样才能收到更准确的答案?
至于 N,它可以大到 179。
例如,我能够为 n 最多 32 位执行此操作:
new Random().nextInt(2^n-1)+1
Run Code Online (Sandbox Code Playgroud)
nextLong() 是不可能的,因为我不能向它传递一个值,它只能生成一个高达 48 位的随机值。