当前位置:编程学习 > C#/ASP.NET >>

问下8421码的一个算法~~~~~求助~~~~~

    有个签到功能,数据库里设计了一个字段int,用来保存一个月里面的签到情况。
请问如何用8421码来进行操作插入更新和判断啊??

比如判断一个月内签到几天的情况。具体哪天签到的情况。 --------------------编程问答-------------------- 这个是具体的设计的问题。
32余一位。想怎么存。自己看着办呗。 --------------------编程问答-------------------- 8421和你的Int有什么关系, 8421还是2421都是系统层面的东西,你需要用到吗?

你要用到的,估计就是位运算吧?

int day = DateTime.Now.Day;  // 获取日期中的天数,
int data = ....;   // 签到情况
int mask = 0x1 << day;
if( mask & data != 0 )
   有签到.
else
   未签到. --------------------编程问答--------------------
引用 2 楼  的回复:
8421和你的Int有什么关系, 8421还是2421都是系统层面的东西,你需要用到吗?

你要用到的,估计就是位运算吧?

int day = DateTime.Now.Day;  // 获取日期中的天数,
int data = ....;   // 签到情况
int mask = 0x1 << day;
if( mask & data != 0 )
   有签到.
……


// 设置签到
if( mask & data == 0 )
     data |= mask; 
else
     已经签到了,不用再签到 --------------------编程问答-------------------- 就是一个字段中记录的是1-31号所有的签到信息。。。。。  --------------------编程问答-------------------- 上面不是已经可以了吗? 明白了? --------------------编程问答-------------------- 哦。问下插入的时候是怎么进行记录啊。。。比如1号签到。2号没签到。。3号又签到了。。。这个字段应该怎么记录的呀??? --------------------编程问答-------------------- 用按位或运算就可以了 --------------------编程问答-------------------- 那有没有知道这个字段已经签到了几次呢??用位移的话。。。谢谢了。。。 --------------------编程问答--------------------
using System;

class App
{
    public static Int32 _Signin;

    public static Int32 GetSignin(Byte index)
    {
        return (Byte)(_Signin >> index & 1);
    }

    public static void SetSignin(Byte index, Byte value)
    {
        if (value > 0)
        {
            _Signin = 1 << index | _Signin;
        }
        else
        {
            _Signin = ~(1 << index) & _Signin;
        }
    }

    static void Main()
    {
        for (Byte i = 0; i < 31; i++)
        {
            SetSignin(i, (Byte)(i % 2 == 0 ? 1 : 0));
        }

        for (Byte i = 0; i < 31; i++)
        {
            Console.WriteLine(GetSignin(i));
        }

        Console.ReadKey();
    }
}



--------------------编程问答-------------------- 要循环才能知道签到次数嘛。。。。 --------------------编程问答--------------------
引用 10 楼  的回复:
要循环才能知道签到次数嘛。。。。


你试试嘛
GetSignin的参数是inex,你可以传23进去,也可以传31进去,当然,也可以试试38


--------------------编程问答-------------------- = = 。我要次数。。传这个干吗。。。 --------------------编程问答-------------------- 嗯嗯
是我错了


--------------------编程问答--------------------
public int CountData(int data)// 统计一个月签到次数
    data = (data & 0x55555555) + ((data >> 1) & 0x55555555);
    data = (data & 0x33333333) + ((data >> 2) & 0x33333333);
    data = (data & 0x0F0F0F0F) + ((data >> 4) & 0x0F0F0F0F);
    data = (data & 0x00FF00FF) + ((data >> 8) & 0x00FF00FF);
    data = (data & 0x0000FFFF) + ((data >>16) & 0x0000FFFF);

    return data;
}
public bool Check(int data, int day) // 判断某天是否签到了
{
    int mask = 0x1 << day;
    return ( mask & data != 0 )
}
public int Set(int data, int day) // 某天的签到
{
    data |= mask;
    return data;
}
如果还不明白,没办法了,怎么保存数据库,怎么取,baidu吧
--------------------编程问答-------------------- 这种设计比较疯狂啊,半点退路都不给自己留啊

请问你怎么处理大小月和二月的,要是来个闰年闰月,你又怎么办。

客户一拍脑袋说我还要出报表,把每个月的情况直接显示出来,你又傻了。从你这个字段里还根本认不出这是那个月的,所以只好在弄一个月份字段 --------------------编程问答-------------------- 这种设计看上去好像技术上挺高级的,但是商业上其实是比较弱智的设计 --------------------编程问答--------------------
引用 15 楼  的回复:
所以"只好"在弄一个月份字段

我觉得啊
并不是"只好"这么勉强
而且"必须"或者"一定"
楼主就算没有这个每日签到的功能
日期字期也是有的
就算没有日期字段
InputDate之类的录入日志也应该有一个吧


--------------------编程问答-------------------- 谢谢啦。多谢上面的兄弟了。我会思考这个问题的。 --------------------编程问答-------------------- public static Int32 GetSignin(Byte index)
    {
        return (Byte)(_Signin >> index & 1);
    }

    public static void SetSignin(Byte index, Byte value)
--------------------编程问答--------------------   data = (data & 0x55555555) + ((data >> 1) & 0x55555555);
        data = (data & 0x33333333) + ((data >> 2) & 0x33333333);
        data = (data & 0x0F0F0F0F) + ((data >> 4) & 0x0F0F0F0F);
        data = (data & 0x00FF00FF) + ((data >> 8) & 0x00FF00FF);
        data = (data & 0x0000FFFF) + ((data >>16) & 0x0000FFFF);

这块的逻辑能说说嘛。。。 看的有点晕。。。 --------------------编程问答--------------------
引用 20 楼  的回复:
  data = (data & 0x55555555) + ((data >> 1) & 0x55555555);
        data = (data & 0x33333333) + ((data >> 2) & 0x33333333);
        data = (data & 0x0F0F0F0F) + ((data >> 4) &am……


统计一个32位的数据,里面有多少个1啊,
就是, 第1次是8组数据相加,然后是四组,然后是2组,然后是1组数据相加.就可以得出总共有多少个1了
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,