标签: bit-shift

汇编语言为C.

所以我有以下汇编语言代码,我需要将其转换为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)

c assembly bit-shift

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

在C++中哪个更快?(2*i + 1)或(i << 1 | 1)?

我意识到答案可能是硬件特定的,但我很好奇是否有一种更普遍的直觉,我错过了?

我问了这个问题并给出了答案,现在我想知道我是否应该改变我的方法一般使用"(i << 1 | 1)"而不是"(2*i + 1)"??

c++ performance assembly bit-shift

8
推荐指数
3
解决办法
815
查看次数

有没有办法在gcc <4.4上做128位整数

gcc4.4似乎是在他们添加的时候int128_t我需要使用位移,而且我已经用完了一些位字段.

编辑:可能是因为我在32位计算机上,没有办法让它用于32位计算机(Intel Atom),是吗?我不在乎它是否会产生棘手的慢速机器代码,如果我按照预期的工作位移.

c gcc bit-shift 128-bit

8
推荐指数
2
解决办法
5000
查看次数

在C中操作80位数据类型

我在C中实现了一些涉及80位密钥的加密算法.特定操作涉及旋转移位键x位数.

我已经尝试过long double类型,如果我没有错,那就是80位,但这对于bitshift运算符不起作用.

我能想到的唯一选择是使用10元素char数组和一些复杂的循环和if-else.

我的问题是,是否有一些简单而有效的方法来实现这一目标.

谢谢.

c cryptography rotation bit-shift fpga

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

(int)Math.pow(2,x)和1 << x的Java结果不同

下面两个步骤:为什么产生在Java中不同的结果x = 3132但同样的结果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)

java bit-shift bitwise-operators

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

当x = 0x80000000时,〜(x-1)和~x + 1之间的差异

我使用的语言是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相同

我想知道为什么会这样.谢谢.

c bit-shift

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

优化C中的按位运算

我手头有一个问题:"练习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)

c bit-shift bitwise-operators

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

在字节数组中设置特定位

我想知道如何设置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# arrays bit-shift

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

负值左移0个位置?

在C中,负值的左移是未定义的行为.我遇到了两个用英特尔ICC编译的库,其中删除了有问题的代码.在Clang,Comeau,GCC和MSVC下,相同的代码也没问题.

该标准是否提及左移0位的负值?它还未定义吗?

(我很好奇的细节是一个0大小的班次,在练习中根本没有任何转变.所以我想知道语言是否含糊不清,这样可以允许0左右的左移).

c bit-shift

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

为什么没有留下位移<<在long int数据类型中移位超过31?

我想在我的程序中使用以下代码,但是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之外的所有位都打开,从而显示数据类型可以容纳的最大值.

c++ bit-shift

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