我有一个程序读取游戏中实体的"原始"列表,我打算创建一个数组,其中包含一个不确定数量的实体的索引号(int),用于处理各种事物.我想避免使用太多的内存或CPU来保存这些索引......
到目前为止,我使用的一个快速而肮脏的解决方案是在主处理函数(本地焦点)中声明具有最大游戏实体大小的数组,以及另一个整数来跟踪已添加到列表中的数量.这并不令人满意,因为每个列表都拥有3000多个阵列,这并不是那么多,但感觉就像是浪费,因为我可以使用6-7列表的解决方案来实现不同的功能.
我没有找到任何C(不是C++或C#)特定的解决方案来实现这一目标.我可以使用指针,但我有点害怕使用它们(除非它是唯一可能的方式).
数组不会离开本地函数作用域(它们将被传递给函数,然后被丢弃),以防更改内容.
如果指针是唯一的解决方案,我如何跟踪它们以避免泄漏?
if ((n & -n) == n) // i.e., n is a power of 2
// rest of the code
Run Code Online (Sandbox Code Playgroud)
为什么是这样?
昨天我进行了一次有趣的采访,面试官问我一个经典问题:如何在不使用*运算符的情况下将Java中的两个数字相乘.老实说,我不知道这是采访带来的压力,但我无法提出任何解决方案.
面试结束后,我回到家中,通过SO轻松寻找答案.到目前为止,我发现了以下内容:
第一种方法:使用For循环
// Using For loop
public static int multiplierLoop(int a, int b) {
int resultat = 0;
for (int i = 0; i < a; i++) {
resultat += b;
}
return resultat;
}
Run Code Online (Sandbox Code Playgroud)
第二种方法:使用递归
// using Recursion
public static int multiplier(int a, int b) {
if ((a == 0) || (b == 0))
return 0;
else
return (a + multiplier(a, b - 1));
}
Run Code Online (Sandbox Code Playgroud)
第三种方法:使用Log10
**// Using Math.Log10
public static double multiplierLog(int …Run Code Online (Sandbox Code Playgroud) 我有一个位板,如果只有一位设置为1,我想检查C.
#include <stdint.h>
typedef uint64_t bboard;
bboard b = 0x0000000000000010;
if (only_one_bit_set_to_one (b)) // in this example expected true
// do something...
Run Code Online (Sandbox Code Playgroud)
有没有想过写这个功能int only_one_bit_set_to_one (bboard b)?
我的任务是修改Sergiu Dotenco的Well Equidistributed Long-period Linear(WELL)算法代码以不使用boost(不是说提升是坏的,但由于某些公司的政策,我必须删除它).
现在,Sergiu的WELL正在使用boost的mpl库,背后有相当多的逻辑.所以一种方法是阅读所有这些,然后我自然能够完成任务.另一种方式是,用一些最佳猜测逐位替换.
我是第二种方式希望这种尝试和错误的方法会更快.到目前为止,我已经成功地替代boost::mpl::if_和if_c使用std::conditional,但命中错误时尝试更新IsPowerOfTwo和Power2Modulo等,这就是为什么我寻求帮助那里.
下面是代码,如何在没有boost的情况下重写它,但只有c ++ 17?
/**
* Conditional expression of type (r & (r - 1)) == 0 which allows to check
* whether a number @f$r@f$ is of type @f$2^n@f$.
*/
typedef boost::mpl::equal_to<
boost::mpl::bitand_<
boost::mpl::_,
boost::mpl::minus<boost::mpl::_, boost::mpl::int_<1>
>
>,
boost::mpl::int_<0>
> IsPowerOfTwo;
template<class UIntType, UIntType r>
struct Power2Modulo
{
typedef typename boost::mpl::apply<
IsPowerOfTwo,
boost::mpl::integral_c<UIntType, r>
>::type type;
BOOST_STATIC_ASSERT(type::value);
template<class T>
static T …Run Code Online (Sandbox Code Playgroud) 最近我发现,如果我需要查看变量是偶数(还是奇数),我只能看看变量的最后一位是否等于0.这个发现在实现时取代了少数模2计算,因此整个函数运行得更快.
还有像这样的"技巧",使用位可以替代其他计算,从而改善功能执行时间吗?
我使用64位整数内的位存储标志.
我想知道是否有一个位设置无论64位整数内的位置(ei我不关心任何特定位的位置).
boolean isOneSingleBitSet (long integer64)
{
return ....;
}
Run Code Online (Sandbox Code Playgroud)
我可以使用Bit Twiddling Hacks(Sean Eron Anderson)计算位数,但我想知道检测单个位是否设置的最有效方法是什么...
我发现了一些其他相关的问题:
以及一些维基百科页面:
注意:我的应用程序是在java中,但我很好奇使用其他语言的优化...
编辑:琉永福指出我的问题在我的第一个链接已经得到了答案:请参见如果一个整数是2的幂确定的位操作黑客(肖恩·安德森玉龙).我没有意识到单个位与2的幂相同.
可能重复:
如何检查数字是否为2的幂
我想确定一个数字是否在
1
2
4
8
16
32
64
128
256
512
1024
2048
4096
8192
16384
...
我试过这个:
public static void Main(string[] args)
{
int result = 1;
for (int i = 0; i < 15; i++)
{
//Console.WriteLine(result);
Console.WriteLine(result % 2);
result *= 2;
}
}
Run Code Online (Sandbox Code Playgroud)
你可以看到它返回
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
...
我应该如何有效地使上述印刷品0适用于包括1在内的所有印刷品?