小编Aeo*_*yan的帖子

如何使用位操作有效地找到64位值中唯一设置位的位置?

只是说我的类型值uint64_t被视为八位字节序列(1个八位字节= 8位).uint64_t已知该值仅包含MSB位置的一个设置位.因此,该uint64_t值可以是以下二进制表示之一:

00000000 00000000 00000000 00000000 00000000 00000000 00000000 10000000  pos = 7
00000000 00000000 00000000 00000000 00000000 00000000 10000000 00000000  pos = 15
00000000 00000000 00000000 00000000 00000000 10000000 00000000 00000000  pos = 23
00000000 00000000 00000000 00000000 10000000 00000000 00000000 00000000  pos = 31
00000000 00000000 00000000 10000000 00000000 00000000 00000000 00000000  pos = 39
00000000 00000000 10000000 00000000 00000000 00000000 00000000 00000000  pos = 47
00000000 10000000 00000000 00000000 …
Run Code Online (Sandbox Code Playgroud)

c optimization bit-manipulation

38
推荐指数
5
解决办法
3485
查看次数

积分真常数的类型是什么?

我很抱歉提出一个非常基本的问题.请考虑以下示例:

const
  c1 = 1;      // Is this Byte or ShortInt?
  c2 = 1234;   // Is this Word or Smallint?
  c3 = 123456; // Is this Cardinal or Integer?
Run Code Online (Sandbox Code Playgroud)

阅读本文档后,我可以得出结论,负值被解释为有符号,正值被解释为无符号.但是,例如123456(根据文档将被解释为Cardinal)也可以在上下文中使用Integer,我的意思是它用Integer在计算中使用常量的变量中.因此,是否始终保证不断地将Cardinal类型转换为Integer必要的?

delphi

6
推荐指数
2
解决办法
422
查看次数

这个C乘法的等效Delphi代码是什么产生了一个超大的数字?

这个问题的背景是......我正试图int popcount_3(uint64_t x)维基百科中移植C函数:汉明重量,但它的算法不是这个问题的焦点.

假设x是无符号64位值的最大数量(即x = 18446744073709551615),在计算结束时,C代码将计算:

uint64_t iResult = 578721382704613384ull * 72340172838076673ull;
Run Code Online (Sandbox Code Playgroud)

首先我怀疑C代码引发了溢出错误,因为使用浮点乘法时操作的实际/实际结果等于41864804849942400000000000000000000,但事实上,该C代码没有编译错误.输出为4627501566018457608.

我们知道,上面C代码的Delphi代码是:

iResult := UInt64(578721382704613384) * UInt64(72340172838076673);
Run Code Online (Sandbox Code Playgroud)

Delphi编译器在转换或算术运算中引发错误E2099溢出.好的,我看到错误是合理的.

所以,我的问题是......对于超大数字的乘法,等效的Delphi代码是什么,以便Delphi给出与C相同的结果?

稍后补充

预测即将发生的潜在问题"为什么我使用真正的常量表达式提供示例?" ,原因是我想创建一个真常量,通过计算设置位数来计算计算机字中的位数High(NativeUInt).

重现步骤

GCC 4.8.1(MinGW)

#include <stdio.h>
#include <stdint.h>

int main () {
  uint64_t iResult = 578721382704613384ull * 72340172838076673ull;
  printf("iResult = %llu\n", iResult); // output --> 4627501566018457608
  return 0; …
Run Code Online (Sandbox Code Playgroud)

delphi delphi-xe3

6
推荐指数
1
解决办法
284
查看次数

函数外部声明会增加重复调用函数的性能吗?

function MyFunc(const Value: Integer): Integer;
const
  MyArray: array[0..255] of Byte = ( ... ); // values of the array here

begin
  ... // Some codes here
  Result := Integer(MyArray[Value shr 58]);
end;
Run Code Online (Sandbox Code Playgroud)

会声明MyArray外面MyFunc增加反复调用的性能MyFunc吗?

delphi function

5
推荐指数
1
解决办法
108
查看次数

如何确定TSysCharSet(AnsiChar集)是否未分配?

为了避免函数中可能出现的错误,我需要预先检查TSysCharSet类型(或AnsiChar集合)的变量是否未分配.我该怎么做?

procedure TestSysCharSet(const AnsiCharSet: TSysCharSet);
begin
  if PByte(@AnsiCharSet) = nil then WriteLn('The AnsiCharSet is unassigned.')
  else if AnsiCharSet = [] then WriteLn('The AnsiCharSet is empty.');
end;

procedure Test();
var
  AnsiCharSet: TSysCharSet;

begin
  // The AnsiCharSet is intentionally made unassigned
  TestSysCharSet(AnsiCharSet);
  ReadLn;
end;

begin
  Test();
end.
Run Code Online (Sandbox Code Playgroud)

提前致谢.

delphi

1
推荐指数
1
解决办法
90
查看次数