84669 Lernen von Personen
152542 Lernen von Personen
20005 Lernen von Personen
5487 Lernen von Personen
7821 Lernen von Personen
359900 Lernen von Personen
3350 Lernen von Personen
180660 Lernen von Personen
48569 Lernen von Personen
18603 Lernen von Personen
40936 Lernen von Personen
1549 Lernen von Personen
1183 Lernen von Personen
32909 Lernen von Personen
如题,正在学习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.格雷码
用来设置对象的属性
例如在给单片机写代码时,要给某个寄存器赋值,使用按位运算显然要简单高效。