1.最近做项目中遇到位运算问题,由于单片机设置闹钟的日程选择一周的时间用0和1表示;0表示未选择,1选择,
2.如int[1,0,1,1,0,0,1,1];表示周一(yse),周二(N0)。。。。以次类推;
3.然后就是 int[] 要转成byte 只能是一位,一位byte位转成二进制是8位,从低位到高位分别对应int[]的从0位取值到int[] 的最大;
直接上代码:
温习一下,位运算:
1、左移( << ),缺位许补0,也就是低位补0;
2、右移( >> ) 高位补符号位;
3、无符号右移( >>> ) 高位补0,通常用于负数位算;
4、位与( & ),第一个操作数的的第n位于第二个操作数的第n位如果都是1,结果的第n为也为1,否则为0,每个对应位都需要做比较;
5、位或( | ),第一个操作数的的第n位于第二个操作数的第n位 只要有一个是1,那么结果的第n为也为1,否则为0;
6、位异或( ^ ),第一个操作数的的第n位于第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0;
7、位非( ~ ),操作数的第n位为1,那么结果的第n位为0,反之,每一位对应位都需要做比较;
public staticvoid main(String[] args) {
int arrays[] = { 0, 1, 1, 1, 1, 0, 1 };
byte b=0;
for (inti = 0; i < arrays.length; i++) {
b|=(arrays[i]<<i);
}
System.out.println(b);
System.out.println(Arrays.toString(getIntArraysByByte( b)));
}
//输出:94
[0, 1, 1, 1, 1, 0, 1]
/--------------------------------------------
/** int[] 转 byte */
public static byte intArrToByte(intarrInt[]) {
byte b = 0;
for (inti = 0; i < arrInt.length; i++) {
b |= arrInt[i] << i;
}
returnb;
}
/**
* 一个字节转成int[] 数据 用于计算一周7天的时间是否被选择
*
* @param b
* @return
*
*/
public static int[] getIntArraysByByte(byte b) {
String st = Integer.toBinaryString(b);//int转成二进制
int stb = Integer.valueOf(st, 2);//二进制转成int
int[] arrays = new int[7];//也可以长度为4,因为byte计算有效数据,不足的自动补0;
for (int i = 0; i < 7; i++) {
arrays[i] = (stb >> i) & 0x01;
}
return arrays;
}