Skip to content

Commit dc30cec

Browse files
authored
add BitUtils
增加位运算工具
1 parent e5debbf commit dc30cec

File tree

1 file changed

+175
-0
lines changed

1 file changed

+175
-0
lines changed
Lines changed: 175 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,175 @@
1+
/*
2+
******************* Copyright (c) ***********************\
3+
**
4+
** (c) Copyright 2015, 蒋朋, china. sd
5+
** All Rights Reserved
6+
**
7+
**
8+
**
9+
**
10+
** _oo0oo_
11+
** o8888888o
12+
** 88" . "88
13+
** (| -_- |)
14+
** 0\ = /0
15+
** ___/`---'\___
16+
** .' \\| |// '.
17+
** / \\||| : |||// \
18+
** / _||||| -:- |||||- \
19+
** | | \\\ - /// | |
20+
** | \_| ''\---/'' |_/ |
21+
** \ .-\__ '-' ___/-. /
22+
** ___'. .' /--.--\ `. .'___
23+
** ."" '< `.___\_<|>_/___.' >' "".
24+
** | | : `- \`.;`\ _ /`;.`/ - ` : | |
25+
** \ \ `_. \_ __\ /__ _/ .-` / /
26+
** =====`-.____`.___ \_____/___.-`___.-'=====
27+
** `=---='
28+
**
29+
**
30+
** ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
31+
**
32+
** 佛祖保佑 永无BUG
33+
**
34+
**
35+
** 南无本师释迦牟尼佛
36+
**
37+
38+
**----------------------版本信息------------------------
39+
** 版 本: V0.1
40+
**
41+
******************* End of Head **********************\
42+
*/
43+
44+
package com.blankj.utilcode.utils;
45+
46+
47+
import java.io.PrintStream;
48+
import java.nio.ByteBuffer;
49+
50+
/**
51+
* 文 件 名: BitUtils
52+
* 创 建 人: 蒋朋
53+
* 创建日期: 16-9-27 08:56
54+
* 邮 箱: [email protected]
55+
* 博 客: https://jp1017.github.io/
56+
* 描 述:Java 位运算的常用方法封装
57+
* 修 改 人:
58+
* 修改时间:
59+
* 修改备注:
60+
*/
61+
62+
public class BitUtils {
63+
public static final String TAG = "BITUTILSLOG";
64+
65+
private BitUtils() {
66+
throw new UnsupportedOperationException("u can't fuck me...");
67+
}
68+
69+
/**
70+
* 获取运算数指定位置的值<br>
71+
* 例如: 0000 1011 获取其第 0 位的值为 1, 第 2 位 的值为 0<br>
72+
*
73+
* @param source
74+
* 需要运算的数
75+
* @param pos
76+
* 指定位置 (0<=pos<=7)
77+
* @return 指定位置的值(0 or 1)
78+
*/
79+
public static byte getBitValue(byte source, int pos) {
80+
return (byte) ((source >> pos) & 1);
81+
}
82+
83+
84+
/**
85+
* 将运算数指定位置的值置为指定值<br>
86+
* 例: 0000 1011 需要更新为 0000 1111, 即第 2 位的值需要置为 1<br>
87+
*
88+
* @param source
89+
* 需要运算的数
90+
* @param pos
91+
* 指定位置 (0<=pos<=7)
92+
* @param value
93+
* 只能取值为 0, 或 1, 所有大于0的值作为1处理, 所有小于0的值作为0处理
94+
*
95+
* @return 运算后的结果数
96+
*/
97+
public static byte setBitValue(byte source, int pos, byte value) {
98+
99+
byte mask = (byte) (1 << pos);
100+
if (value > 0) {
101+
source |= mask;
102+
} else {
103+
source &= (~mask);
104+
}
105+
106+
return source;
107+
}
108+
109+
110+
/**
111+
* 将运算数指定位置取反值<br>
112+
* 例: 0000 1011 指定第 3 位取反, 结果为 0000 0011; 指定第2位取反, 结果为 0000 1111<br>
113+
*
114+
* @param source
115+
*
116+
* @param pos
117+
* 指定位置 (0<=pos<=7)
118+
*
119+
* @return 运算后的结果数
120+
*/
121+
public static byte reverseBitValue(byte source, int pos) {
122+
byte mask = (byte) (1 << pos);
123+
return (byte) (source ^ mask);
124+
}
125+
126+
127+
/**
128+
* 检查运算数的指定位置是否为1<br>
129+
*
130+
* @param source
131+
* 需要运算的数
132+
* @param pos
133+
* 指定位置 (0<=pos<=7)
134+
* @return true 表示指定位置值为1, false 表示指定位置值为 0
135+
*/
136+
public static boolean checkBitValue(byte source, int pos) {
137+
138+
source = (byte) (source >>> pos);
139+
140+
return (source & 1) == 1;
141+
}
142+
143+
/**
144+
* 入口函数做测试<br>
145+
*
146+
* @param args
147+
*/
148+
public static void main(String[] args) {
149+
150+
// 取十进制 11 (二级制 0000 1011) 为例子
151+
byte source = 11;
152+
153+
// 取第2位值并输出, 结果应为 0000 1011
154+
for (byte i = 7; i >= 0; i--) {
155+
Log.d(TAG, getBitValue(source, i) + "");
156+
}
157+
158+
// 将第6位置为1并输出 , 结果为 75 (0100 1011)
159+
Log.d(TAG, setBitValue(source, 6, (byte) 1) + "");
160+
161+
// 将第6位取反并输出, 结果应为75(0100 1011)
162+
Log.d(TAG, reverseBitValue(source, 6) + "");
163+
164+
// 检查第6位是否为1,结果应为false
165+
Log.d(TAG, checkBitValue(source, 6) + "");
166+
167+
// 输出为1的位, 结果应为 0 1 3
168+
for (byte i = 0; i < 8; i++) {
169+
if (checkBitValue(source, i)) {
170+
Log.d(TAG, i + "");
171+
}
172+
}
173+
174+
}
175+
}

0 commit comments

Comments
 (0)