相关疑难解决方法(0)

什么是按位移位(位移)运算符以及它们如何工作?

我一直在尝试在业余时间学习C语言,其他语言(C#,Java等)具有相同的概念(通常是相同的运算符)......

我想知道是,在核心层,是什么位移(<<,>>,>>>)这样做,可以帮助它什么问题解决,和周围的弯曲什么潜伏的陷阱?换句话说,一个绝对的初学者指导比特移位的所有优点.

bit-manipulation binary-operators operators bit-shift

1340
推荐指数
9
解决办法
67万
查看次数

117
推荐指数
7
解决办法
16万
查看次数

在C++中,我是否应该费心缓存变量,还是让编译器进行优化?(混叠)

请考虑以下代码(p属于类型unsigned char*bitmap->width属于某种整数类型,具体哪个是未知的,取决于我们正在使用的某个外部库的版本):

for (unsigned x = 0;  x < static_cast<unsigned>(bitmap->width);  ++x)
{
    *p++ = 0xAA;
    *p++ = 0xBB;
    *p++ = 0xCC;
}
Run Code Online (Sandbox Code Playgroud)

值得优化它[...]

可能存在这样一种情况,即通过编写可以产生更有效的结果:

unsigned width(static_cast<unsigned>(bitmap->width));
for (unsigned x = 0;  x < width;  ++x)
{
    *p++ = 0xAA;
    *p++ = 0xBB;
    *p++ = 0xCC;
}
Run Code Online (Sandbox Code Playgroud)

...或者编译器优化是否微不足道?

您认为什么是"更好"的代码?

编辑(Ike)的注意事项:对于那些对三角形文本感到疑惑的人来说,原来的问题,如同措辞一样,非常接近于偏离主题的领域,并且尽管有积极的反馈,但非常接近于被关闭.这些已经被打乱了.但是,请不要惩罚那些解决这些问题的受影响部分的回答者.

c++ optimization performance caching strict-aliasing

114
推荐指数
9
解决办法
7276
查看次数

为什么32位寄存器上的x86-64指令归零整个64位寄存器的上半部分?

x86-64 Tour of Intel Manuals中,我读到了

也许最令人惊讶的事实是,诸如MOV EAX, EBX自动将指令的高32位归零的指令RAX.

同一来源引用的英特尔文档(3.4.1.1 64位手动基本架构中的通用寄存器)告诉我们:

  • 64位操作数在目标通用寄存器中生成64位结果.
  • 32位操作数生成32位结果,在目标通用寄存器中零扩展为64位结果.
  • 8位和16位操作数生成8位或16位结果.目标通用寄存器的高56位或48位(分别)不会被操作修改.如果8位或16位操作的结果用于64位地址计算,则将寄存器显式符号扩展为完整的64位.

在x86-32和x86-64汇编中,16位指令如

mov ax, bx
Run Code Online (Sandbox Code Playgroud)

不要表现出这种"奇怪"的行为,即eax的上层词被归零.

因此:引入这种行为的原因是什么?乍一看似乎不合逻辑(但原因可能是我习惯了x86-32汇编的怪癖).

x86 assembly x86-64 cpu-registers zero-extension

97
推荐指数
3
解决办法
2万
查看次数

LEA或ADD指令?

当我手写组装时,我通常会选择表格

lea eax, [eax+4]
Run Code Online (Sandbox Code Playgroud)

在表格上..

add eax, 4
Run Code Online (Sandbox Code Playgroud)

我听说lea是一个"0时钟"指令(如NOP),而'add'则不是.但是,当我看到编译器生成的程序集时,我经常看到后一种形式而不是第一种.我足够聪明地相信编译器,所以任何人都可以了解哪一个更好?哪一个更快?为什么编译器选择后一种形式呢?

x86 assembly

46
推荐指数
3
解决办法
2万
查看次数

如何找到任何整数的10的下一个倍数?

动态整数将是0到150之间的任何数字.

即 - 数字返回41,需要返回50.如果数字是10则需要返回10.数字是1需要返回10.

如果我将整数修改为小数,我以为我可以使用天花板功能......?然后使用天花板功能,并回到十进制?
唯一的事情也是必须知道这个数字是1,2或3位数(即-7 vs 94 vs 136)

有没有更好的方法来实现这一目标?

谢谢,

c algorithm math

42
推荐指数
5
解决办法
4万
查看次数

"leal 0x10(%ebx),%eax"x86汇编指令中的0x10是多少?

关于这个LEAL指令,0x10的功能是什么?它是一个乘法或加法还是别的?

leal 0x10(%ebx), %eax
Run Code Online (Sandbox Code Playgroud)

有人可以澄清一下吗?这是Linux机器上的x86汇编程序.

x86 assembly instructions

32
推荐指数
1
解决办法
4万
查看次数

将寄存器设置为零的方法有多少?

我很好奇有多少种方法可以在x86汇编中将寄存器设置为零.使用一条指令.有人告诉我,他设法找到了至少10种方法.

我能想到的是:

xor ax,ax
mov ax, 0
and ax, 0
Run Code Online (Sandbox Code Playgroud)

x86 assembly tasm x86-16

28
推荐指数
2
解决办法
3万
查看次数

哪个更快?++,+ =或x + 1?

我正在使用C#(这个问题也适用于像C++这样的类似语言),我试图找出最快,最有效的增量方法.在我的游戏中,它不仅仅是一个或两个增量,而是每秒300个增量.就像屏幕上每个精灵的帧都在递增,我的RPG角色的速度和位置,相机的偏移等等.所以我在想,最有效的方法是什么?例如,y_pos我可以做的每次运动增加5 :

1.

Player.YPos += 5;
Run Code Online (Sandbox Code Playgroud)

2.

Player.YPos = Player.YPos + 5;
Run Code Online (Sandbox Code Playgroud)

3.

for (int i = 0; i < 5; i++)
{
    Player.YPos++;
}
Run Code Online (Sandbox Code Playgroud)

哪个是最有效的(也是最快的)?

.net c# performance operators

20
推荐指数
3
解决办法
5090
查看次数

LEAL汇编指令有什么作用?

我对它们之间的区别有点困惑

leal -4(%ebp), %eax       
Run Code Online (Sandbox Code Playgroud)

movl -4(%ebp), %eax
Run Code Online (Sandbox Code Playgroud)

谁可以给我解释一下这个?

c x86 assembly

19
推荐指数
2
解决办法
4万
查看次数