Cool_Breeze 发表于 2020-4-25 11:40:13

位移

c:
#include <stdio.h>
#include <string.h>
void print_byte_content(int);
int main()
{

        int value;
        short before=1920;
        short after=1080;
        memmove((char*)&value,(char*)&before,2);//低位
        memmove((char*)&value+2,(char*)&after,2);//高位
       
        print_byte_content(before);
        print_byte_content(after);
        print_byte_content(value);
       
        int width=value<<16;//低位往高位移
        print_byte_content(width);
        width=width>>16;//高位往低位移
        print_byte_content(width);
       
        int height=value>>16;
        print_byte_content(height);
        return value;
}

void print_byte_content(int data)
{       
        int len;
        int byte;
        printf("int %d 内存地址上的内容为:\n",data);
        for (len=0;len<sizeof(data);len++)
        {
                printf("%d:\t",len);
                for (byte=7;byte>=0;byte--)
                        printf("%d",(*((char*)&data+len)&(1<<byte)) != 0);
                putchar('\n');
        }
}
bat内容:
@echo off
0410.exe

set value=%errorlevel%
set /a height="value>>16"
set /a width="value<<16"
set /a width="width>>16"

echo height=%height%
echo width=%width%
pause
结果:
int 1920 内存地址上的内容为:
0:      10000000
1:      00000111
2:      00000000
3:      00000000
int 1080 内存地址上的内容为:
0:      00111000
1:      00000100
2:      00000000
3:      00000000
int 70780800 内存地址上的内容为:
0:      10000000
1:      00000111
2:      00111000
3:      00000100
int 125829120 内存地址上的内容为:
0:      00000000
1:      00000000
2:      10000000
3:      00000111
int 1920 内存地址上的内容为:
0:      10000000
1:      00000111
2:      00000000
3:      00000000
int 1080 内存地址上的内容为:
0:      00111000
1:      00000100
2:      00000000
3:      00000000
height=1080
width=1920
请按任意键继续. . .

SugarCane88 发表于 2020-4-26 07:34:39

printf("%d",(*((char*)&data+len)&(1<<byte)) != 0);

这段看不太懂,请指点一下。

另外:
int width=value<<16;//低位往高位移

这句在我电脑上编译出错是怎么回事呢?

Cool_Breeze 发表于 2020-4-26 08:03:29

SugarCane88 发表于 2020-4-26 07:34
这段看不太懂,请指点一下。

另外:


将【*((char*)&data+len)】这个数与【(1<<byte)】按位与,只有两个比特位都为1结果为1,1 != 0成立,打印1,相反为0;这样就是输出了1个比特位的值,循环8次【(1<<byte)】,每个位都有做比较!

编译器报错,你可以把你的报错信息贴出来看看。我用的devc++

SugarCane88 发表于 2020-4-26 08:17:31

Cool_Breeze 发表于 2020-4-26 08:03
将【*((char*)&data+len)】这个数与【(1

谢谢您的回复,我用的是VC6.0,估计编程环境的问题。
页: [1]
查看完整版本: 位移