
已解决问题
谷歌U2507630633用户在2023.04.21提交了关于“马化腾C语言 位操作”的提问,欢迎大家涌跃发表自己的观点。目前共有1个回答,最后更新于2024-10-26T16:33:33。/*该函数用于切换一个值中的后N位,待处理值和N都是函数的参数*/
#include<stdio.h>
#include<limits.h>
/*把整数变成字符串*/
char*itobs(int,char*);
/*显示二进制数*/
voidshow_bstr(constchar*);
/*将**m的后bits切换,即1变0,0变1*/
intinvert_end(int**m,intbits);
intmain(void)
{
charbin_str[Ch**AR_BIT*sizeof(int)+1];
int**mber;
puts("Enterintegersandseetheminbinary");
puts("Non-**mericinputteminatesprogram.");
while(scanf("%d",&**mber)==1)
{
itobs(**mber,bin_str);
printf("%dis",**mber);//奇特的地方
show_bstr(bin_str);
putchar('\n');
**mber=invert_end(**mber,4);
putchar('\n');
printf("Invertingthelast4bitsgives\n");
itobs(**mber,bin_str);
printf("%dis",**mber);//奇特的地方
show_bstr(bin_str);
putchar('\n');
}
puts("Bye!");
return0;
}
char*itobs(intn,char*ps)
{
inti;
conststaticintsize=Ch**AR_BIT*sizeof(int);
for(i=size-1;i>=0;i--,n>>=1)
{
ps[i]=(01&n)+'0';
}
ps[size]='\0';
returnps;
}
voidshow_bstr(constchar*pstr)
{
inti;
while(pstr[i])
{
putchar(pstr[i]);
if(++i%4==0&&pstr[i])
{
putchar('');
}
}
}
intinvert_end(int**m,intbits)
{
intmask=0;
intbitval=1;
while(bits-->0)
{
mask|=bitval;
bitval<<=1;
}
return**m^mask;
}
------------------------------
这个代码可以把一个整数的后N位数做切换操作,即二进制形式下,后N位中的1变成0,0变成1.我测试过代码能正常运行。比如下面图片中输入7.我的问题是在主函数中有两个printf()语句,printf("%dis",**mber);//奇特的地方。如果我把这个语句注释掉,那输入7以后就无法正确输出结果。我不太理解为什么。因为我认为这只是一个输出我刚才输入的整数(即我输入的7)的语句,至于二进制的输出有下面的show_bstr(bin_str)函数。即使我注释掉printf("%dis",**mber);那也应该会显示后面的二进制数(即show_bstr(bin_str)函数的内容)。
希望大家能够帮助她。详细问题描述及疑问:
/*该函数用于切换一个值中的后N位,待处理值和N都是函数的参数*/
#include<stdio.h>
#include<limits.h>
/*把整数变成字符串*/
char*itobs(int,char*);
/*显示二进制数*/
voidshow_bstr(constchar*);
/*将**m的后bits切换,即1变0,0变1*/
intinvert_end(int**m,intbits);
intmain(void)
{
charbin_str[Ch**AR_BIT*sizeof(int)+1];
int**mber;
puts("Enterintegersandseetheminbinary");
puts("Non-**mericinputteminatesprogram.");
while(scanf("%d",&**mber)==1)
{
itobs(**mber,bin_str);
printf("%dis",**mber);//奇特的地方
show_bstr(bin_str);
putchar('\n');
**mber=invert_end(**mber,4);
putchar('\n');
printf("Invertingthelast4bitsgives\n");
itobs(**mber,bin_str);
printf("%dis",**mber);//奇特的地方
show_bstr(bin_str);
putchar('\n');
}
puts("Bye!");
return0;
}
char*itobs(intn,char*ps)
{
inti;
conststaticintsize=Ch**AR_BIT*sizeof(int);
for(i=size-1;i>=0;i--,n>>=1)
{
ps[i]=(01&n)+'0';
}
ps[size]='\0';
returnps;
}
voidshow_bstr(constchar*pstr)
{
inti;
while(pstr[i])
{
putchar(pstr[i]);
if(++i%4==0&&pstr[i])
{
putchar('');
}
}
}
intinvert_end(int**m,intbits)
{
intmask=0;
intbitval=1;
while(bits-->0)
{
mask|=bitval;
bitval<<=1;
}
return**m^mask;
}
------------------------------
这个代码可以把一个整数的后N位数做切换操作,即二进制形式下,后N位中的1变成0,0变成1.我测试过代码能正常运行。比如下面图片中输入7.我的问题是在主函数中有两个printf()语句,printf("%dis",**mber);//奇特的地方。如果我把这个语句注释掉,那输入7以后就无法正确输出结果。我不太理解为什么。因为我认为这只是一个输出我刚才输入的整数(即我输入的7)的语句,至于二进制的输出有下面的show_bstr(bin_str)函数。即使我注释掉printf("%dis",**mber);那也应该会显示后面的二进制数(即show_bstr(bin_str)函数的内容)。
期待您的答案,谢谢你帮我,祝你快乐,愿你事事如意 !