有没有办法在C中的两个连续内存空间之间移位?

时间:2016-01-17 10:48:55

标签: c bits shift

我试图通过“<<”来移动整数后检索丢失的位运算符,所以我创建了一个int指针“b”,我用full 1初始化。在地址bi的左边创建了一个int“a”,我初始化为0.然后,我执行左移“* b”并检查了没有改变的a的值,那么是否可以在连续的存储空间上真正移位?

这是我的代码:

    int main(){

    int a=0;

    int *b;

    b = &a + 1;

    *b=0xffffffff;

    *b<<2;

    printf("%d\n",a);

    return 0;
}

2 个答案:

答案 0 :(得分:0)

只需测试较低内存操作数的MSbit并设置一个标志,然后将整数转换为整数或者如果标志设置则转换为1: 布尔国旗

int i[2];    //This should guarantee the correct order of int's
....
flag = i[0] & 0x10000000;    //Assume integer to be 32 bits
i[0] <<= 1;
i[1] <<= 1;
if (flag)
    i[1] |= 1;

以下代码适用于任何连续或不连续的内存。代码使用指针“排序”地址:

#define pMin(x, y) (x)<(y)?(x):(y)
#define pMax(x, y) (x)>(y)?(x):(y)

int main(void)
{
    int flag;
    unsigned a, b;
    unsigned *p1, *p2;

    p1 = pMin(&a, &b);
    p2 = pMax(&a, &b);

    printf("&a = %p\n", &a);
    printf("&b = %p\n", &b);
    printf("p1 = %p\n", p1);
    printf("p2 = %p\n", p2);

    *p1 = 1;
    for (int i=0; i<64; i++)
    {
        flag = *p1 & 0x80000000;
        printf ("%03d) flag=%5.5s, Value=%08x%08x\n", i, flag?"true":"false", *p2, *p1);
        *p1 <<= 1;
        *p2 <<= 1;
        if (flag)
            *p2 |= 1;
    }
    return 0;
}

请注意2个宏pMinpMax对地址进行排序。

答案 1 :(得分:0)

为什么不在换班之前反转换档。以下示例:

#include <stdio.h>
#include <stdlib.h>

int lshift(int var,int nbits, int *lost){
    if(lost)
        *lost=var>>((sizeof(int)*8)-nbits);
    return var<<nbits;
}

int main() {

    int n=0xffffdd, // variable n
        l,          // l for lost
        v;          // v for result

    v=lshift(n,16,&l);
    printf( "var n\t= %08X\n"
            "result\t= %08X\n"
            "lost\t= %08X\n",
            n,v,l); 
    return 0;
}