有意思的问题,我来小答一下,以抛砖引玉。
目前我所知道的有两个:
第一种情况: 如上面同学所说,提升运算速度。
举个例子:
int i = 2;
int k = i * 1024;
上面这个例子,在计算 k 的值,一般我们都会这么写。
这么写有问题吗?
当然没有问题,还相当标准。
但是这么写对性能没有什么帮助,如果我们清楚位运算会更快,那么驱动或者硬件的老手就会这么写:
k = i << 10;
当然性能上,对于大型服务器,不会因为你写了这么一句话,就会提升很多,但是如果是单片机的话,可能就会快很多。
还有人问,大部分我可能不是 乘以 1024,而是 乘以 1000,这种情况岂不是不行了。
我回答是:分情况。如果你的数值是约数,不需要精确的话,那么你依然可以这么写,如果是需要精确数值的话,恐怕不行。
第二种情况:减少内存损耗,好吧,也是因为单片机的原因。
举个例子:如果我有 4096 个成员,要标志,4096 个成员,是男是女(比如 1 是男,0 是女),大部分情况下,我们会这么写:
unsigned char member[4096]
内存损耗为 sizeof(member) == 4096 个字节
但是如果我们可以这么定义:
uint32_t member[128]
内存损耗为 sizeof(member) == 128 * 4 = 512 个字节 = 4096 位
也就是说,每一位代表一个成员的性别,1 是男,0 是女,是不是会节省很多内存呢?
一个简单的应用:设计options。比如,网络状态
typedef NS_OPTIONS(NSUInteger, NetworkOptions) {
Network_None = 0,
Network_2G = 1<1,
Network_3G = 1<2,
Network_4G = 1<3,
Network_wifi = 1<4,
};
当需要在弱网或无网状态下进行某些操作,那么可以用Network_None|Network_2G|Network_3G表示
在java里面位运算你可以看下Integer类中的几个方法,几乎大部分都是用的位运算,因为位运算是在硬件层面就可以直接计算的所以更快,如果采用简单的迭代和加减乘除的话效率不在一个层级
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。