84669 personnes étudient
152542 personnes étudient
20005 personnes étudient
5487 personnes étudient
7821 personnes étudient
359900 personnes étudient
3350 personnes étudient
180660 personnes étudient
48569 personnes étudient
18603 personnes étudient
40936 personnes étudient
1549 personnes étudient
1183 personnes étudient
32909 personnes étudient
如题,正在学习C语言,其中有个知识点是按位运算,跟着书上的介绍和动手去写示例程序明白白其中的原理了。就是对存储在内存中的一个或两个值的位进行运算,也会对两个值进行按位与、按位或、取反等的操作。
自己一点粗略的理解是通过对内存的直接操作可以节省资源提高效率。
请问这个知识点的应用点是在哪里?比如:最常用在什么场景中,大概哪类程序中?再能举几个例子最好拉。
补充:感谢大家的热心回答,基本能解除我的疑惑了。
拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...
比如一个三十二位的数,每一位代表一种中断,那么去清零某一位就是用与,如果要置位某一位就用或。
可以用移位的运算优化效率,可以用1bit的空间做flag
比如有一个8位二进制整数,每一位的1代表通电,0代表断电,我们要让8个开关挨个通断电就需要用位运算了,可以去找单片机的代码看看
如果用位移来计算,最好交给编译器优化,如x<<12,比如直接x*1024.位常用的一个就是标志位,比如一个功能有哪些特性,可以用位来表示。如flag1=0x1flag2=0x2flag3=0x4flag4=0x8if(flag&flag3){....}
位运算的意义在于运行效率通常比加减乘除高几倍到几十倍,在很关心速度的算法中常常会采用,例如很多比较底层的算法。缺点是可读性和可维护性差。例子可以看这个网页:https://graphics.stanford.edu/~seander/bithacks.html
此外,用整数表示集合,用位运算进行集合操作,也是一种常见的用法。
认同 @__simple 的说法,单片机中的置位(1)和清零(0)可以通过与另外一个量来运算取得
总的来说,为运算节省空间,速度快,应用的例子有1.位图索引。比如说qq号或电话号码的去重和查询;2.位掩码。典型的是linux文件权限;3.生成伪随机数;4.格雷码
用来设置对象的属性
例如在给单片机写代码时,要给某个寄存器赋值,使用按位运算显然要简单高效。
比如一个三十二位的数,每一位代表一种中断,那么去清零某一位就是用与,如果要置位某一位就用或。
可以用移位的运算优化效率,可以用1bit的空间做flag
比如有一个8位二进制整数,每一位的1代表通电,0代表断电,我们要让8个开关挨个通断电就需要用位运算了,可以去找单片机的代码看看
如果用位移来计算,最好交给编译器优化,如x<<12,比如直接x*1024.
位常用的一个就是标志位,比如一个功能有哪些特性,可以用位来表示。
如
flag1=0x1
flag2=0x2
flag3=0x4
flag4=0x8
if(flag&flag3){
....
}
位运算的意义在于运行效率通常比加减乘除高几倍到几十倍,在很关心速度的算法中常常会采用,例如很多比较底层的算法。缺点是可读性和可维护性差。例子可以看这个网页:https://graphics.stanford.edu/~seander/bithacks.html
此外,用整数表示集合,用位运算进行集合操作,也是一种常见的用法。
认同 @__simple 的说法,单片机中的置位(1)和清零(0)可以通过与另外一个量来运算取得
总的来说,为运算节省空间,速度快,应用的例子有
1.位图索引。比如说qq号或电话号码的去重和查询;
2.位掩码。典型的是linux文件权限;
3.生成伪随机数;
4.格雷码
用来设置对象的属性
例如在给单片机写代码时,要给某个寄存器赋值,使用按位运算显然要简单高效。