文档章节

JAVA中常用的二进制位操作

一贱书生
 一贱书生
发布于 2016/11/19 10:01
字数 618
阅读 9
收藏 0

一,计算某个正数的二进制表示法中 1 的个数

复制代码

1     //求解正数的二进制表示法中的 1 的位数
2     private static int countBit(int num){
3         int count = 0;
4         for(; num > 0; count++)
5         {
6             num &= (num - 1);
7         }
8         return count;
9     }

复制代码

算法思路:每次for循环,都将num的二进制中最右边的 1 清除。

为什么n &= (n – 1)能清除最右边的1呢?因为从二进制的角度讲,n相当于在n - 1的最低位加上1。举个例子,8(1000)= 7(0111)+ 1(0001),所以8 & 7 = (1000)&(0111)= 0(0000),清除了8最右边的1(其实就是最高位的1,因为8的二进制中只有一个1)。再比如7(0111)= 6(0110)+ 1(0001),所以7 & 6 = (0111)&(0110)= 6(0110),清除了7的二进制表示中最右边的1(也就是最低位的1)。

参考:算法-求二进制数中1的个数

 

二,获取某个数的第 i 位(判断某个数的第 i 位是0 还是 1?)

 思路:如果第 i 位 与 1 相与 结果为1 表明第 i 位为1;如果为0 表明第 i 位为0

//获取 整数 num 的第 i 位的值
    private static boolean getBit(int num, int i)
    {
        return ((num & (1 << i)) != 0);//true 表示第i位为1,否则为0
    }

1 左移 i 位后,得到一个数,这个数只有第 i 位为1,其它位都为0

num 与这个数相与,得到的结果 要么是0,要么非0。结果为 非0 表示第 i 位为1,结果为0 表示第 i 位为0

 

 三,将第 i 位设置为1

思路:第 i 位与0 或,值不变。第 i 位与1 或,变成1。因此,我们的目标是 num 与 一个第 i 位值为1,其它位的值都为0的数相 或

//将 整数 num 的第 i 位的值 置为 1
    private static int getBit(int num, int i)
    {
        return (num | (1 << i));
    }

 

四,将第 i 位设置为0(清0)

思路:第 i 位和0与,第 i 位就变成了0。其它位 都与 1 与,其它位保持不变。这样,就只把第 i 位清0了

//将 整数 num 的第 i 位的值 置为 1
    private static int getBit(int num, int i)
    {
       int mask = ~(1 << i);//000100
       return (num & (mask));//111011
    }

 

总之,获取第 i 位的值,或者是将第 i 位置0或者置1  ,其总体思路就是:将 1 左移 i 位,然后再进行 与操作 或者  或操作。

© 著作权归作者所有

共有 人打赏支持
一贱书生
粉丝 19
博文 724
码字总数 600123
作品 0
私信 提问
趋势科技提醒:赶快修补Java漏洞吧

近日Java软件被爆出一个新型Java漏洞,可被黑客利用挂马网页大面积传播木马,并可使得被感染电脑被恶意控制。 该漏洞主要影响采用Java技术的软件,包括很多企业中常用的财务软件与办公自动化...

keshu99
2011/12/07
684
4
Java拾遗:014 - 二进制、进制转换及位运算

二进制 二进制是计算机中广泛采用的一种数制,由0和1组成,进位规则为“逢二进一”,如:0001表示十进制中的1,0010表示十进制中的2。二进制拥有大量非学有用的特性,详情参考:百度百科:二...

一别丶经年
2018/08/02
0
0
BasicDataSource数据源配置及其资料

在开发基于数据库的应用系统时,需要在项目中进行数据源的配置来为数据库的操作取得数据库连接。配置不同数据库的数据源的方法大体上都是相同的,不同的只是不同数据库的JDBC驱动类和连接URL...

AaronP
2014/09/30
0
0
java基础--JDK安装、环境变量配置、工具开发第一个程序、数据类型、运算符

-----Java基础大纲----- **-----本章节-----** 1.Java语言的历史、特点及工作原理 2.JRE和JDK的介绍 3.Java运行环境和开发工具 4.Java基础语法 **-----下一章节-----** 5.条件语句 6.循环 7....

我是宁采臣
2018/06/26
0
0
JDK 中常用的包

JDK 中常用的包 Java 私塾跟我学系列——JAVA 篇 配合Java 私塾课堂实录学习视频,可以事半功倍。 视频地址:www.javass.cn/javapeixunzlxz/zlxz.html java.lang----包含一些 Java 语言的核心...

luodis
2010/12/23
690
0

没有更多内容

加载失败,请刷新页面

加载更多

iOS个人中心渐变动画、微信对话框、标签选择器、自定义导航栏、短信验证输入框等源码

iOS精选源码 简单的个人中心页面-自定义导航栏并予以渐变动画 程序员取悦女票的正确姿势---Tip1(iOS美容篇) iOS 前台重启应用和清除角标的问题 微信原生提醒对话框3.0 JHLikeButton - 有趣...

Android爱开源
15分钟前
0
0
Yii2使用驼峰命名的形式访问控制器

yii2在使用的时候,访问控制器的时候,如果控制器的名称是驼峰命名法,那访问的url中要改成横线的形式。例如: public function actionRoomUpdate(){//}//访问的时候就要www.test.co...

dragon_tech
17分钟前
0
0
Navicat使用教程:使用Navicat Query Analyzer优化查询性能(第2部分)

下载Navicat Monitor最新版本 Navicat Monitor 是一套安全、简单而且无代理的远程服务器监控工具。它具有强大的功能使你的监控发挥最大效用。受监控的服务器包括 MySQL、MariaDB 和 Percona ...

电池盒
24分钟前
0
0
Python3 读写utf-8文本文件

with open('testRead.txt', 'r', encoding='utf-8') as f: for each_line in f: Passwith open('testWrite.txt', 'w', encoding='utf-8') as f: f.write('写入的内容'......

编程老陆
27分钟前
0
0
Linux syslog相关函数详解

介绍 syslog是Unix系统的日志系统。可以将日志记录在本地系统中。 一个完整的syslong日志包含如下信息:程序模块 | 严重性 | 时间 | 主机名 | 进程名 | 进程ID | 正文。 syslong相关函数 1....

RongJinhui0
31分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部