签到功能二进制实现
思路
一个月最多31天,四个字节有32位,每个bit位代表一天,签到则置为1,默认是0代表没签到
例:
import java.util.Calendar; /** * 签到工具类 */ public class SigningManager { private int element; public SigningManager() { this.element = 0; } /** * 当天签到 * * @return 签到成功true, 失败false */ public boolean signToday() { int dayOfMonth = Calendar.getInstance().get(Calendar.DAY_OF_MONTH); int old = this.element; element |= 1 << (dayOfMonth - 1); return element != old; } public boolean signToday(int day) { int old = this.element; element |= 1 << (day - 1); return element != old; } /** * 查询当月某天是否签到 * * @param dayOfMonth 当月第几天 * @return 签到返回true, 否则false */ public boolean getSignStatus(int dayOfMonth) { return (element & (1 << (dayOfMonth - 1))) != 0; } /** * @return 当月签到次数 */ public int getSignDays() { return Integer.bitCount(element); } /** * 统计连续签到天数的次数 * * @param day * @return */ public int continuousNumber(int day) { String str = intToBinary32(element, 32); int count = 0; int num = 0; for (int i = 0; i < str.length(); i++) { if (str.charAt(i) == '1') { num++; } else { num = 0; } if (num == day) { count++; num = 0; } } return count; } public static String intToBinary32(int i, int bitNum) { StringBuilder binaryStr = new StringBuilder(Integer.toBinaryString(i)); while (binaryStr.length() < bitNum) { binaryStr.insert(0, "0"); } return binaryStr.toString(); } public static void main(String[] args) { // //A=26 // //0000 0000 0000 0000 0000 0000 0001 1010 // //00000000000000000000000000011010 // // SigningManager signingManager = new SigningManager(); // signingManager.element = 26; // // System.out.println(intToBinary32(signingManager.element, 32)); // // System.out.println(intToBinary32(1 << (1 - 1), 32)); // System.out.println(intToBinary32(1 << (2 - 1), 32)); // System.out.println(intToBinary32(1 << (3 - 1), 32)); // System.out.println(intToBinary32(1 << (4 - 1), 32)); // System.out.println(intToBinary32(1 << (5 - 1), 32)); // // System.out.println("------------------------------------------"); // // System.out.println(Integer.parseInt("00000000000000000000000000000001", 2)); // System.out.println(Integer.parseInt("00000000000000000000000000000010", 2)); // System.out.println(Integer.parseInt("00000000000000000000000000000100", 2)); // System.out.println(Integer.parseInt("00000000000000000000000000001000", 2)); // System.out.println(Integer.parseInt("00000000000000000000000000010000", 2)); // // System.out.println("------------------------------------------"); // // System.out.println(signingManager.element & 1); // System.out.println(signingManager.element & 2); // System.out.println(signingManager.element & 4); // System.out.println(signingManager.element & 8); // System.out.println(signingManager.element & 16); // // System.out.println("------------------------------------------"); // // System.out.println((signingManager.element & 1) != 0); // System.out.println((signingManager.element & 2) != 0); // System.out.println((signingManager.element & 4) != 0); // System.out.println((signingManager.element & 8) != 0); // System.out.println((signingManager.element & 16) != 0); // // //00000000000000000000000000011010 & // //00000000000000000000000000000001 // //00000000000000000000000000000000 // // //00000000000000000000000000011010 & // //00000000000000000000000000000010 // //00000000000000000000000000000010 // // //00000000000000000000000000011010 & // //00000000000000000000000000010000 // //00000000000000000000000000010000 // // System.out.println("------------------------------------------"); // // // System.out.println(intToBinary32(1 << (20 - 1), 32)); // //00000000000000000000000000011010 | // //00000000000010000000000000000000 // //00000000000010000000000000011010 // System.out.println(Integer.parseInt("00000000000010000000000000011010", 2)); // System.out.println(signingManager.element |= (1 << (20 - 1))); // // System.out.println("------------------------------------------"); // for (int i = 1; i <= 31; i++) { // System.out.println(i + " " + signingManager.getSignStatus(i)); // } //例:5天签到连续送物品 // 31 0x1f 11111 SigningManager signingManager = new SigningManager(); signingManager.signToday(1); signingManager.signToday(2); signingManager.signToday(3); signingManager.signToday(4); // signingManager.signToday(5); signingManager.signToday(6); signingManager.signToday(7); signingManager.signToday(8); signingManager.signToday(9); // signingManager.signToday(10); signingManager.signToday(11); signingManager.signToday(12); signingManager.signToday(13); signingManager.signToday(14); // signingManager.signToday(15); // signingManager.signToday(16); // signingManager.signToday(17); // signingManager.signToday(18); // signingManager.signToday(19); // signingManager.signToday(20); // signingManager.signToday(21); // signingManager.signToday(22); // signingManager.signToday(23); // signingManager.signToday(24); // signingManager.signToday(25); // signingManager.signToday(26); // signingManager.signToday(27); // signingManager.signToday(28); // signingManager.signToday(29); // signingManager.signToday(30); // signingManager.signToday(31); // signingManager.signToday(32); System.out.println(signingManager.element); System.out.println(intToBinary32(signingManager.element, 32)); //补签 signingManager.signToday(10); System.out.println(intToBinary32(signingManager.element, 32)); System.out.println(intToBinary32(31, 32)); System.out.println(signingManager.continuousNumber(2)); } }