文章导读:
- 1、c语言中如何提取二进制数中的某一位?
- 2、C语言中如何将一个数字的各个位上的数分别提取?
- 3、c语言如何截取一串数字中的一部分?
- 4、C语言怎样提取一个数的十位个位百位千位?
- 5、C语言 函数 提取出整数的每位数
- 6、C语言怎样截取数字的某几位?/这题怎么做?(在线等)
c语言中如何提取二进制数中的某一位?
下面是三种方式:
①通过模2除2(%2、/2)的方法
num%2——取出二进制的最后一位
num/2——右移去掉二进制的最后一位
通过while循环,依次取出二进制的最后一位数字判断是否为1,若为1则count++,while(num)只有当num变为0时循环结束。
问题:在测试-1出现bug,-1的二进制中应该有32个1,输出却为0。我们将-1带入代码中发现-1%2=0,count不增,然后-1/2=0,循环结束,故输出count的值为0。
解决方案:将变量num的数据类型改为unsigned int (无符号整型),此时表示的是正的整型的最大值,所以当num=-1时,表示二进制为32个1的正数,通过循环可以输出正确的个数。
②通过右移操作符()、按位与操作符()实现
Example:当num=10(1010),通过右移操作numi,二进制向右移动i位。
//i=0,num0,右移0位,此时(1010)(0001)=0
//i=1,num1,右移1位,此时(0101)(0001)=1,count++
//i=2,num2,右移2位,此时(0010)(0001)=0
//i=3,num3,右移3位,此时(0001)(0001)=1,count++
……
因为二进制共32位,所以循环要执行32次后结束,得到count为2。
缺点:不够高效,必须循环32次。
③通过按位与操作符()巧妙运算实现
Example: 当num=15时,
1//num(num-1)=(1111)(1110)=(1110)
2//num(num-1)=(1110)(1101)=(1100)
3//num(num-1)=(1100)(1011)=(1000)
4//num(num-1)=(1000)(0111)=0 ,循环停止。共执行4次while循环。
扩展资料
一、指定的某一位数置1
宏 #define setbit(x,y) x|=(1y)
二、指定的某一位数置0
宏 #define clrbit(x,y) x=~(1y)
三、指定的某一位数取反
宏 #define reversebit(x,y) x^=(1y)
四、获取的某一位的值
宏 #define getbit(x,y) ((x) (y)1)
C语言中如何将一个数字的各个位上的数分别提取?
#includestdio.h
int main()
{
int a;
int b[111]={0};//这里数组必须赋于初值,不然系统会随机赋值,将输出错误!赋值任何数
scanf("%d",a);//都行!
int i=0;
while(a!=0)
{
b[i]=a%10; //将各个位的数赋值于数组b[i] ;
a/=10; //现在数组b[i]记录的是各个位上的数的反序;
i++; //i记录这个数是几位数 ;
}
for(int j=i-1;j=0;j--)
{
printf("%d ",b[j]) ; //最后反序输出数组b[j];
}
return 0;
}
有不理解的地方,欢迎追问。望采纳!
c语言如何截取一串数字中的一部分?
这种计算肯定是从右边向左,不停的移位运算,然后用与运算,根据每个需要截取的数字的位数确定移位运算的右移数字,在确定与运算的数字,所有都计算完成后最左边的用零补足。
C语言怎样提取一个数的十位个位百位千位?
设一个数为n,则在C语言中其个位、十位、百位、千位依次这样计算:n/1%10,n/10%10,n/100%10,n/1000%10
代码如下:
#includestdio.h
int main(){
int n = 123456;
int unitPlace = n / 1 % 10;
int tenPlace = n / 10 % 10;
int hundredPlace = n / 100 % 10;
int thousandPlace = n / 1000 % 10;
printf("个位:%d\n十位:%d\n百位:%d\n千位:%d\n", unitPlace, tenPlace, hundredPlace, thousandPlace);
getchar();
return 0;
}
运行结果如图:
扩展资料
C语言的运算符包含的范围很广泛,共有34种运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理。从而使C语言的运算类型极其丰富,表达式类型多样化。灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。
参考资料:百度百科--C语言
C语言 函数 提取出整数的每位数
#include stdio.h
void prnint(int a)
{
if(a/10==0)
printf("%c",a+'0');
else
{
prnint(a/10);
printf("%c",a%10+'0');
}
}
int main(void)
{
int a;
scanf("%d",a)
prnint(a);
return 0;
}
C语言怎样截取数字的某几位?/这题怎么做?(在线等)
我的要烦琐点,不过你看得懂就可以:
#include stdio.h
int main( )
{
int time1, time2, hours, mins, t1h, t1m, t2h, t2m;
scanf("%d%d", time1, time2);
/*---------*/
t1m = time1 % 100; // 存储time1的分数
t1h = time1 / 100; // 存储time1的小时数
t2m = time2 % 100; // 同上
t2h = time2 / 100; // 同上
if(t2m t1m)
{
mins = t2m + 60 - t1m; // 不足借60分减去一小时
--t2h;
}
else
mins = t2m - t1m;
if(t2h t1h)
hours = t2h + 24 - t1h; // 不足借1天
else
hours = t2h - t1h;
printf("The train journey time is %d hrs %d mins.\n", hours, mins);
}
这程序有个限制就是你不能输入大于24的数字作为小时和大于60的数字作为分钟,否则结果不确定;而且如果前后两个时间跨越的天数不止一天的话算出来的其实也是一个小于24小时的时间(相当于假定只跨越了一天)。
型极其丰富,表达式类型多样化。灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。参考资料:百度百科--C语言C语言 函数 提取出整数的每位数#include