注册 登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天朝布衣田中码农参上

苦逼码农的点点滴滴,请多多指教!

 
 
 

日志

 
 
 
 

Java利用位运算来处理标记位的问题  

2016-11-26 10:01:51|  分类: JAVA |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
项目中经常有需要使用标记位的场合,大部分人可能会使用如下语句来处理:

int hava=1; //无的话使用0

boolean=true; //这个更清楚,真或假

但其实想要提高性能的话,完全可以使用位运算,性能高而且可以节省资源,但当然啦,有好处就肯定会坏处,写法可能就不那么直观,但其实注释详细的话,倒也还好。
对于位运算,就不多说,相信大家在学习编程的过程中,其实对这个就比较了解了。那么下面来取个例子,类型里面可能有多个标记位,一般情况下会采用多个变量来分别标识,但借助于位运算,一个byte变量就可以演变八个标记位【如果是short,int,long,那么就可以演变为16,32,64个】。相关示范的代码如下:

package com.topone;
public class Main {
public static void main(String[] args) {
//这里用byte只能够处理8位,如果需要16位,或32位,64位,请使用short,int或long
byte flag = 0; //二进制表现为00000000
//将倒数第3位置成1
flag|=1<<2; //这里的1左位移2就成了00000100,然后与flag或运算
printShort(flag);
//重复进行也不会出错
flag|=1<<2;
printShort(flag);
//将第一位置为1
flag|=1<<7;
printShort(flag);
//取标志位也很简单,如想取第一位
printFlag(flag,1);
//取第二位
printFlag(flag,2);
//将标志位置0,就稍麻烦点,要加判断,如果标记位为1才处理,否则无视
flag=(byte)((flag&(1<<2))>0?flag-(1<<2):flag);
printShort(flag);
//标记位全清零XOR下
flag^=flag;
printShort(flag);
}

//用来将short二进制打印出来
static void printShort(byte i)
{
System.out.print("short:" + i + ",binary:0b");
for (int j = 7; j >= 0; j--)
{
if (((1 << j) & i) != 0){
System.out.print("1");
}else{
System.out.print("0");
}
}
System.out.println(" ");
}
//用来判断标记位
static void printFlag(byte i,int pos)
{
printShort(i);
//这里是byte型所以用8来减,如果用short,int或long型请调整为16,32,64
if((short)(i&(1<<(8-pos)))>0){
//该标志位为1
System.out.println("flag:1");
}else{
//该标志位为0
System.out.println("flag:0");
}
}
}

运行的结果如下:
Java利用位运算来处理标记位的问题 - sinsunson - 天朝布衣田中码农参上
怎么样,看起来是不是很简单,这里byte因为是有符号的,所以如果第一位为1的话会变成负数,它的取值范围为(-128~127),而short取值范围为(-32 768~32 767),至于int和long就更大了,所以需要使用那个就自行判断。
 
 
  评论这张
 
阅读(5)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018