所以我有以下汇编语言代码,我需要将其转换为C.我对代码的几行感到困惑.
我知道这是一个for循环.我在每一行都添加了我的评论.
我认为for循环是这样的
for (int i = 1; i > 0; i << what?) {
//Calculate result
}
Run Code Online (Sandbox Code Playgroud)
测试条件是什么?我该如何改变呢?
查看汇编代码,变量'n'有什么作用?
这是Intel x86,因此格式为movl = source,dest
movl 8(%ebp), %esi //Get x
movl 12(%ebp), %ebx //Get n
movl $-1, %edi //This should be result
movl $1, %edx //The i of the loop
.L2:
movl %edx, %eax
andl %esi, %eax
xorl %eax, %edi //result = result ^ (i & x)
movl %ebx, %ecx //Why do we do this? As we …Run Code Online (Sandbox Code Playgroud) 我意识到答案可能是硬件特定的,但我很好奇是否有一种更普遍的直觉,我错过了?
我问了这个问题并给出了答案,现在我想知道我是否应该改变我的方法一般使用"(i << 1 | 1)"而不是"(2*i + 1)"??
gcc4.4似乎是在他们添加的时候int128_t我需要使用位移,而且我已经用完了一些位字段.
编辑:可能是因为我在32位计算机上,没有办法让它用于32位计算机(Intel Atom),是吗?我不在乎它是否会产生棘手的慢速机器代码,如果我按照预期的工作位移.
我在C中实现了一些涉及80位密钥的加密算法.特定操作涉及旋转移位键x位数.
我已经尝试过long double类型,如果我没有错,那就是80位,但这对于bitshift运算符不起作用.
我能想到的唯一选择是使用10元素char数组和一些复杂的循环和if-else.
我的问题是,是否有一些简单而有效的方法来实现这一目标.
谢谢.
下面两个步骤:为什么产生在Java中不同的结果x = 31或32但同样的结果x=3?
int x=3;
int b = (int) Math.pow(2,x);
int c = 1<<x;
Run Code Online (Sandbox Code Playgroud)
结果:
x=32: b=2147483647; c=1;
x=31: b=2147483647; c=-2147483648;
x=3: b=8 ; c=8
Run Code Online (Sandbox Code Playgroud) 我使用的语言是C.x和n的类型是int.
我有一个行代码如下
printf("x=%x,n=%d,first=%x,second=%x\n",x,n,((~(x+0xffffffff))>>n),((~x+1)>>n));
Run Code Online (Sandbox Code Playgroud)
它显示了x,n的值和两个移位x的补数的n位的方法.当x = 0x80000000时,〜(x + 0xffffffff)= 0x8000000,~x + 1 = 0x80000000,但当将这两个移位n位时,结果是不同的.
顺便说一下,如果我把0xffffffff改为~1 + 1(即〜(x +(~1 + 1)),结果与~x + 1相同
我想知道为什么会这样.谢谢.
我手头有一个问题:"练习2-6.写一个函数setbits(x,p,n,y)返回x,其中n位从位置p开始设置为y的最右边n位,离开其他位不变."
我已经为此编写了一个函数,如下所示.这是按预期工作的.
int func_setx(int x,int p,int n,int y)
{
int a_t= ~0 << (p+n);
int b_t= ~a_t >> n;
int x_t= x& (a_t | b_t); // a temporary x which has the bits to be changed as 0 , rest of the bits unchanged.
int mask= (y << p) & (~(~0 << (p+n))); // a mask which has required bits from y in positions to be set , rest all bits 0.
printf("\nCheckpoint : mask= %x x_t= %x\n",mask,x_t);
int result= …Run Code Online (Sandbox Code Playgroud) 我想知道如何设置16字节数组(128位)中的特定位.
例如......如果我想在数组中设置第9位,我期望:
{00,80,00,00,00,00,00,00,00,00,00,00,00,00,00,00}
如果我想设置第125位......
{00,00 00,00,00,00,00,00,00,00,00,00,00,00,00,08}
我已经研究过使用位移,但对于如何使用由128位组成的数组进行位移而感到困惑.有没有办法打破这个大小的数组并以较小的字节块进行评估?任何帮助,将不胜感激.
在C中,负值的左移是未定义的行为.我遇到了两个用英特尔ICC编译的库,其中删除了有问题的代码.在Clang,Comeau,GCC和MSVC下,相同的代码也没问题.
该标准是否提及左移0位的负值?它还未定义吗?
(我很好奇的细节是一个0大小的班次,在练习中根本没有任何转变.所以我想知道语言是否含糊不清,这样可以允许0左右的左移).
我想在我的程序中使用以下代码,但是gcc不允许我将我的1转移到31以上.
sizeof(long int) 显示8,所以这并不意味着我可以离开直到63?
#include <iostream>
using namespace std;
int main(){
long int x;
x=(~0 & ~(1<<63));
cout<<x<<endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
编译输出以下警告:
left shift `count >= width` of type [enabled by default] `x=(~0 & ~(1<<63))`;
^
Run Code Online (Sandbox Code Playgroud)
输出为-1.如果我离开31位,我得到2147483647正如预期的那样.
我希望除了MSB之外的所有位都打开,从而显示数据类型可以容纳的最大值.