取模运算是什么意思 如何通俗易懂的解释C语言中的取模?如何正确理解?

[更新]
·
·
分类:互联网
5072 阅读

取模运算是什么意思

如何通俗易懂的解释C语言中的取模?如何正确理解?

如何通俗易懂的解释C语言中的取模?如何正确理解?

取模是计算机将减法计算简单化,变成加法计算的有效方法。二进制计算机中减去一个数,计算非常复杂,而加法就非常简单。减一个数等于加上用模减去这个数后得到的数(补码),于是减法变成加法了。
很多教材中说法不是用到模,而是什么反码 1得到补码,其实只是方便计算得到一个负数的补码,真正理解应该是模减去这个数,得到负数补码(虽然两种结果是一样的)。

语言用取模运算符“%”进行取模运算。
取模运算符“%”的作用是求两个数相除的余数。
取模运算符通常用来判断一个数是否被另一个数整除。
取模运算余数的定义:当被除数不够整除时余下的数。
但是这里存在特殊情况,就是被除数和除数有负数时怎么办。c语言的解决方法是,取模结果的绝对值一定小于除数的绝对值,而取模结果的符号与被除数一致。这样的话就有以下算式:
(1)12%5=2;
(2)12%(-5)=2;
(3)(-12)%5=-2;
(4)(-12)%(-5)=-2;
我是奔跑的蜗牛,希望我的解答对您有所帮助。

余数的定义什么什么,算法怎么算?

意思就是取模,就是取余数。运算方法:比如10mod3,余数是1,结果就是1。

为什么整数取模1等于0?

取模和取余,这两个运算在真整数的时候是一个概论,在负整数进行除法运算时不同。符号:“ % ”。
取整:即求商。符号:“ /
”。取余运算,在计算商值时,商值向0方向舍入,靠近0原则。
取模运算,在计算商值时,商值向负无穷方向舍入;尽可能让商值小的原则(不超多商值的最大值)。

位运算特殊值运算的作用和用途?

位运算在驱动开发中是经常遇到的,尤其是置0和置1。既要指定的位数发生变化,又不能改变其它位的值,还要高效率的编写代码,这时候技巧就很重要了。在位运算中有几个符号: | 按位或 、amp 按位与 、 ^ 异或 、~按位非。
应用技巧
1
判断int型变量a是奇数还是偶数
aamp1 0 偶数
aamp1 1 奇数
2
取int型变量a的第k位 (k0,1,2……sizeof(int))
agtgtkamp1
3
将int型变量a的第k位清0
aaamp~(1lt
4
将int型变量a的第k位置1
aa|(1lt
5
int型变量循环左移k次
(设sizeof(int)16)
aaltgt16-k
6
int型变量a循环右移k次
(设sizeof(int)16)
aagtgtk|altlt16-k
#include ltstdio.hgt
int main()
{
tprintf(#34学习从来不是一个人的事情,要有个相互监督的伙伴
#34)
tprintf(#34工作需要学习C/C 或者有兴趣学习C/C 的伙伴可以家我球球
_2208165112
#34)
treturn 0
}
7
整数的平均值
对于两个整数x,y,如果用 (x y)/2 求平均值,会产生溢出,因为 x y 可能会大于INT_MAX,但是我们知道它们的平均值是肯定不会溢出的,我们用如下算法:
int average(int x, int y) //返回X,Y 的平均值
{
return (xampy) ((x^y)gtgt1)
}
8
判断一个整数是不是2的幂,对于一个数 x gt 0
boolean power2(int x)
{
return ((xamp(x-1))0)ampamp(x!0);
}
9
用位运算符交换两个整数
void swap(int x , int y)
{
x ^ y
y ^ x
x ^ y
}
10
计算绝对值
int abs( int x )
{
int y
y x gtgt 31
return (x^y)-y //or: (x y)^y
}
11
取模运算转化成位运算 (在不产生溢出的情况下)
a % (2^n) 等价于 a amp (2^n - 1)
12
乘法运算转化成位运算 (在不产生溢出的情况下)
a * (2^n) 等价于 altlt n
13
除法运算转化成位运算 (在不产生溢出的情况下)
a / (2^n) 等价于 agtgt n
例: 12/8 12gtgt3
14
判断赋值
if (x a) x b
   else x a 等价于 x a ^ b ^ x
15
x 的 相反数
(~x 1)
技巧虽好,但是大家还是最好自己啃一啃才能知道味道呀,闲暇时,不防拿出来品一品,悟一悟其中的原理所在。
练一练
#include
int main()
{
unsigned int i 0x9f43bda5
unsigned int ret 0
printf(#34i %x
#34,i)
//将 i 第3位置1
ret i | ( 1 ltlt 3 )
printf(#34ret %x
#34,ret)
//将 i 第2位置0
ret i amp ~( 1 ltlt 2 )
printf(#34ret %x
#34,ret)
//将 i 第4~9位置1
ret i | ( 0x3f ltlt 4 )
printf(#34ret %x
#34,ret)
//将 i 第3~7位置0
ret i amp ~(0x1f ltlt 3 )
printf(#34ret %x
#34,ret)
//将 i 第1~7和9~11位置1
ret i | ( 0x3f ltlt 1 | 7 ltlt 9)
printf(#34ret %x
#34,ret)
//将 i 第2~8位置13~20位置0
ret i amp ~( 0x7f ltlt 2 | 0xff ltlt 13 )
printf(#34ret %x
#34,ret)
}