我试图通过“<<”来移动整数后检索丢失的位运算符,所以我创建了一个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;
}
答案 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个宏pMin
和pMax
对地址进行排序。
答案 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;
}