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

Is there a way to shift bits between two contiguous memory spaces in C?

我正在尝试检索使用“<<”运算符移动整数后丢失的位,因此我创建了一个 int 指针 "b",我用完整的 1 进行了初始化。在左边地址 b 我创建了一个初始化为 0 的 int "a"。然后,我执行了“*b”的左移并检查了没有改变的 a 的值,所以是否有可能真正地连续移位位内存空间 ?

这是我的代码:

    int main(){

    int a=0;

    int *b;

    b = &a + 1;

    *b=0xffffffff;

    *b<<2;

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

    return 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;

以下代码适用于任何连续或不连续的内存。该代码使用指向 'sort' 地址的指针:

#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 来对地址进行排序。

为什么不在换档前做反向换档。下面的示例:

#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;
}