java位元算
2016-10-03 14:01
148 查看
1.位介绍
1.1)位运算优势:
程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。所以运行效率更高更快。
1.2)常见的位运算
1.2.1) &运算举例
a)清零,直接和0与
例如整数a为6[0000 0000 0000 0000 0000 0000 0000 0110],a&0x0000=
0000 0000 0000 0000 0000 0000 0000 0000
b)想要保留特定位数
例如整数a想要保留第一位和第三位,只需要和0X5与即可[0000 0000 00000000 0000 0000 0000 0101]
c)获取指定位数
例如获取a位的三位的值,只需要和7与即可。例如a=30;
a&7= 0000 0000 0000 0000 0000 00000001 1110 & 0000 0000 0000 0000 0000 0000 0000 0111 = 0000 0000 0000 00000000 0000 0000 1110
1.2.2)~按位取反
1.2.3)左右移动
<<:左移一位数字放大两倍
>>:右移动一位,数字缩小两倍
1.3:位运算举例
1.3.1)获取最大值
int max= 1<<31 -1 ;
int min=1<<31;
1.3.2)判断奇偶性
[最后一位有1肯定是奇数]
boolean isSigleNumber(int n){
return(n & 1) == 1;
}
1.3.3 不用临时变量交换两个数
a ^= b;
b ^= a;
a ^= b;
1.3.4 两个数字里的最大值
/**
* 1)(a-b) >> 31: a>b,结果是0;a==b,结果是0;a<b,结果是1
* 2)(~(a-b) >> 31):a>b,结果是1;a==b,结果是1;a<b,结果是0
*/
public static int max(int a,int b){
return b & ((a-b) >> 31) | a & (~(a-b) >> 31);
}
1.3.5 两个数里的最小值
public static int min(int a,int b){
return a & ((a-b) >> 31) | b & (~(a-b) >> 31);
}
1.3.6 数字是不是2的幂
booleanisFactorialofTwo(int n){
/*如果是2的幂,n一定是100... n-1就是1111.... 所以做与运算结果为0*/
return n > 0 ? (n & (n - 1)) == 0 : false;
}
1.3.7 统计数字里位数为1的个数
/**
*@function: 统计整数里值的1的总数,
*@param x : 整形值
*@return 返回整形的位数值
*/
public static int bitcount(int x)
{
/*每次当前值与1与,结果大于0,就代表最后一位是1,结果加一,执行完对当前数字右移一位,相当于去比较倒数第二位是不是1,一次循环直到当前数为零,相当统计完了所有位置上的数了。*/
int b=0;
for (b = 0; x != 0; x >>= 1){
if ((x & 1) > 0)
{
b++;
}
}
return b;
}
1.3.8 把整形转换成2进制位数字符串
public static String swtichIntToBit(int value){
//int最高为是表示负数的,只转化正数
if (value<=0) {
return value+"" ;
}
StringBuffer builder = newStringBuffer();
//从最低位逐步取出来对应的位数值,直到右移值为零
for ( ; value !=0; value>>=1) {
int bit= (value&1)>0? 1:0;
builder.append(bit);
}
int less =32- builder.length();
//补齐位数为32位
for (int i = 0; i < less; i++) {
builder.append(0);
}
return builder.reverse().toString();
}
1.1)位运算优势:
程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。所以运行效率更高更快。
1.2)常见的位运算
运算符号 | 含义 | 运行原理 |
& | 按位与 | 两个与位数都是1,才是1,其它都是0 |
| | 按位或 | 两个操作的位数只要有一个为1,就是1,其它是零 |
^ | 按位异或 | 两个操作,数不同为1,相同为0 |
~ | 取反 | 按位逐个取反,0变成1,1变成0 |
<< | 左移 | 向左移动一定位数,尾部不够的位数补0 |
>> | 右移 | 向右移动一定位数,头部空出位数补零, |
1.2.1) &运算举例
a)清零,直接和0与
例如整数a为6[0000 0000 0000 0000 0000 0000 0000 0110],a&0x0000=
0000 0000 0000 0000 0000 0000 0000 0000
b)想要保留特定位数
例如整数a想要保留第一位和第三位,只需要和0X5与即可[0000 0000 00000000 0000 0000 0000 0101]
c)获取指定位数
例如获取a位的三位的值,只需要和7与即可。例如a=30;
a&7= 0000 0000 0000 0000 0000 00000001 1110 & 0000 0000 0000 0000 0000 0000 0000 0111 = 0000 0000 0000 00000000 0000 0000 1110
1.2.2)~按位取反
1.2.3)左右移动
<<:左移一位数字放大两倍
>>:右移动一位,数字缩小两倍
1.3:位运算举例
1.3.1)获取最大值
int max= 1<<31 -1 ;
int min=1<<31;
1.3.2)判断奇偶性
[最后一位有1肯定是奇数]
boolean isSigleNumber(int n){
return(n & 1) == 1;
}
1.3.3 不用临时变量交换两个数
a ^= b;
b ^= a;
a ^= b;
1.3.4 两个数字里的最大值
/**
* 1)(a-b) >> 31: a>b,结果是0;a==b,结果是0;a<b,结果是1
* 2)(~(a-b) >> 31):a>b,结果是1;a==b,结果是1;a<b,结果是0
*/
public static int max(int a,int b){
return b & ((a-b) >> 31) | a & (~(a-b) >> 31);
}
1.3.5 两个数里的最小值
public static int min(int a,int b){
return a & ((a-b) >> 31) | b & (~(a-b) >> 31);
}
1.3.6 数字是不是2的幂
booleanisFactorialofTwo(int n){
/*如果是2的幂,n一定是100... n-1就是1111.... 所以做与运算结果为0*/
return n > 0 ? (n & (n - 1)) == 0 : false;
}
1.3.7 统计数字里位数为1的个数
/**
*@function: 统计整数里值的1的总数,
*@param x : 整形值
*@return 返回整形的位数值
*/
public static int bitcount(int x)
{
/*每次当前值与1与,结果大于0,就代表最后一位是1,结果加一,执行完对当前数字右移一位,相当于去比较倒数第二位是不是1,一次循环直到当前数为零,相当统计完了所有位置上的数了。*/
int b=0;
for (b = 0; x != 0; x >>= 1){
if ((x & 1) > 0)
{
b++;
}
}
return b;
}
1.3.8 把整形转换成2进制位数字符串
public static String swtichIntToBit(int value){
//int最高为是表示负数的,只转化正数
if (value<=0) {
return value+"" ;
}
StringBuffer builder = newStringBuffer();
//从最低位逐步取出来对应的位数值,直到右移值为零
for ( ; value !=0; value>>=1) {
int bit= (value&1)>0? 1:0;
builder.append(bit);
}
int less =32- builder.length();
//补齐位数为32位
for (int i = 0; i < less; i++) {
builder.append(0);
}
return builder.reverse().toString();
}
相关文章推荐
- Flash 与 html 的一些实用技巧
- 使用位运算实现网页中的过滤、筛选功能实例
- C语言 位运算详解及示例代码
- 巧用mysql提示符prompt清晰管理数据库的方法
- php提示Failed to write session data错误的解决方法
- PHP5.5和之前的版本empty函数的不同之处
- pt px 的概念 与 对应关系
- C#枚举中的位运算权限分配浅谈
- JoinChar 向地址中加入 ? 或 & 用于实现传参
- 让 Asp 与 XML 交互
- 服务端 VBScript 与 JScript 几个相同特性的写法与示例
- PHP has encountered a Stack overflow问题解决方法
- 用 或 || 来兼容FireFox
- document.styleSheets[0].rules 与 cssRules区别
- 浅析PHP 按位与或 (^ 、&)
- shell 基本计算、逻辑运算、位运算详解
- php 生成WML页面方法详解
- PHP4 与 MySQL 数据库操作函数详解
- document.open() 与 document.write()
- 小博老师解读经典Java面试题 ——Java位运算