一个int变量能装一个月的签到信息?
2014-12-08 11:57
176 查看
先给出答案:能!并且可以标识这个月内哪天签到过、哪天未签到、并且统计签到的天数!
能够做到这些,得力于对二进制、位运算的应用:int有32位,一个月最多有31天
直接上代码:
public static void main(String args[])
{
int data = 0;
data = (int)setBin_1(data,0);//签到
data = (int)setBin_1(data,1);//签到
data = (int)setBin_1(data,3);//签到
data = (int)setBin_0(data,1);//修改第二天为未签到
data = (int)setBin_1(data,4);//签到
System.out.println(getBin(data, 0)==1?"已签到":"未签到");
System.out.println(getBin(data, 1)==1?"已签到":"未签到");
System.out.println(getBin(data, 2)==1?"已签到":"未签到");
System.out.println(getBin(data, 3)==1?"已签到":"未签到");
System.out.println(getBin(data, 4)==1?"已签到":"未签到");
System.out.println("这个月签到次数:"+getCount(data));
}
/**设置数字上某一位的数值为0*/
public static long setBin_0(long data,int index)
{
return ~(1 << index) & data;
}
/**设置数字上某一位的数值为1*/
public static long setBin_1(long data,int index)
{
return 1 << index | data;
}
/**获取数字上某一位的数值*/
public static long getBin(long data,int index)
{
return data >> index & 1;
}
/**计算一个数所有位中1的总数*/
public static byte getCount(long data)
{
byte count = 0;
for (int i = 0; i < Long.SIZE; i++) {
count += getBin(data, i);
}
return count;
}
输出:
已签到
未签到
未签到
已签到
已签到
这个月签到次数:3
能够做到这些,得力于对二进制、位运算的应用:int有32位,一个月最多有31天
直接上代码:
public static void main(String args[])
{
int data = 0;
data = (int)setBin_1(data,0);//签到
data = (int)setBin_1(data,1);//签到
data = (int)setBin_1(data,3);//签到
data = (int)setBin_0(data,1);//修改第二天为未签到
data = (int)setBin_1(data,4);//签到
System.out.println(getBin(data, 0)==1?"已签到":"未签到");
System.out.println(getBin(data, 1)==1?"已签到":"未签到");
System.out.println(getBin(data, 2)==1?"已签到":"未签到");
System.out.println(getBin(data, 3)==1?"已签到":"未签到");
System.out.println(getBin(data, 4)==1?"已签到":"未签到");
System.out.println("这个月签到次数:"+getCount(data));
}
/**设置数字上某一位的数值为0*/
public static long setBin_0(long data,int index)
{
return ~(1 << index) & data;
}
/**设置数字上某一位的数值为1*/
public static long setBin_1(long data,int index)
{
return 1 << index | data;
}
/**获取数字上某一位的数值*/
public static long getBin(long data,int index)
{
return data >> index & 1;
}
/**计算一个数所有位中1的总数*/
public static byte getCount(long data)
{
byte count = 0;
for (int i = 0; i < Long.SIZE; i++) {
count += getBin(data, i);
}
return count;
}
输出:
已签到
未签到
未签到
已签到
已签到
这个月签到次数:3
相关文章推荐
- 写一个不用cmp指令不用临时变量的int max(int a,int b)函数 不用if ? : switch
- 查询一个int类型的变量(数字)是否在一个字符串里边(逗号分隔的)以及 sqlif 与case
- 声明一个记录类型,定义记录类型变量,保存员工信息
- 练习2-1 编写一个程序以确定分别由signed及unsigend限定的char short int 与long类型变量的取值范围
- 有一个一维整型数组int[]data保存的是一张宽为width,高为height的图片像素值信息。请写一个算法,将该图片所有的白色不透明(0xffffffff)像素点的透明度调整为50%。
- 比如将一个变量转换到INT类型 C#.NET中如何进行强制类型转换
- 写一个方法void triangle(int a,int b,int c),判断三个参数是否能构成一个三角形。如果不能则抛出异常IllegalArgumentException,显示异常信息:a,b,
- 【C语言】编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数。(辗转相除法和常规求法)
- C语言 编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数。
- 练习 2-1 编写一个程序以确定分别由 signed 及 unsigned 限定的 char、short、 int 与 long 类型变量的取值范围。
- IAR编译器一个警告信息-Warning[Pe550]: variable "变量" was set but never used
- 练习2-1 编写一个程序一确定分别由signed及unsigned限定的char,short,int及long类型变量的取值范围。采用打印标准头文件中的相应值以及直接计算两种方式实现。通过直接计算来确定浮点类型的取值范围是一项难度很大的任务。
- 不用任何位操作,获得一个int变量的第九位
- C语言实现 编写一个函数,传入a,b两个int类型的变量,返回两个值的最大公约数。
- 捕获一个int变量, 判断是否…
- 有两个int 型的变量a 和n(0 <= n <= 31),要求写一个表达式,使 该表达式的值和a 的第n 位相同。
- 有一个一维整型数组int[]data保存的是一张宽为width,高为height的图片像素值信息。请写一个算法,将该图片所有的白色不透明(0xffffffff)像素点的透明度调整为50%。
- 我有一个char * 型指针正巧指向一些int 型变量, 我想跳过它们。为什么如下的代码((int *)p)++; 不行?
- 将一个负的short类型的变量赋值给一个int类型的变量,之后int类型的变量的值仍是负数
- 编写一个程序,分别以signed和unsigned限定的char、short、int与long类型的变量取值范围