C语言 位操作

时间:2023.04.21 发布人:U2507630633

C语言 位操作

已解决问题

谷歌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)函数的内容)。

期待您的答案,谢谢你帮我,祝你快乐,愿你事事如意 !
希望以下的回答,能够帮助你。

第1个回答

用户名:whoami1978  

程序有明显的错

你的i没有初始化,它是随内存变化的,巧的是你问答的printf改变了内存的值,使i=0了,所以有printf就会执行其它输出,否则i可以是其它超过8的值,程序能继续运行已是幸运的了。

改为in排曲ti=0;就可以了