前两天有个朋友跟我描述了一个这样的需求:
1住宅 2别墅 4商铺 8写字楼 16酒店式公寓
后台传给前端7就代表选择了 1 + 2 + 4 ,即住宅,别墅,商铺。
传10就是2+8,即别墅,写字楼。
这种方式在前端该如何实现匹配。
其实要解决这个问题的方法很多,区别就在于使用简洁的代码与否。
这个问题的核心所在就是java中与或操作符以及位移操作符的使用,先来了解下这两个操作符:
(1)>> 、<< 位移操作符
<< :左移运算符,例如 num << 1,即相当于 num / 2
>> :右移运算符,例如 num >> 1,即相当于 num*2
举个栗子:
如果num = 10,那么10 << 1,即10 /2=5;
10是十进制数,转换为二进制为:1010,那么10 << 1,即向左移一位,那么后面补0,即变成 10100。10100转换为十进制就是5.反之,以此类推即可。
(2)& 、&& 与操作符
&&操作符相信大家都不陌生,在java中我们经常用到对条件的判断,例如:
if(num > 2 && num != 5) {
// do something
}
即当num大于2,并且不等于5,条件才成立,当num不大于2时,if语句将结束,&&后面的判断将不再执行。
&操作符的区别就是不管第一个条件是否成立,第二个条件都将执行,
按位“与”的计算是把两个数字分别写成二进制形式,然后按照每一位判断,&计算中,只要有一个是0就算成0。
ok,了解了两个操作符的作用,我们回到开始所说的问题,此时相信大家都有了解决的思路,来看核心伪代码:
上面代码中,我们遍历了每个类型,然后拿后台给我们的类型做右移操作,并将结果和1做按位与操作,即可得到最终的结果。
例如,num=10,那么result就是2和8。
针对这个问题,还有一种解决方式:
上述代码只是拿类型值去做按位与操作也是可以的。
ok,今天的内容就这些啦~