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

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

比如判断一个月内签到几天的情况。具体哪天签到的情况。
...全文
481 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
烈火蜓蜻 2012-09-03
  • 打赏
  • 举报
回复
[Quote=引用 20 楼 的回复:]

data = (data & 0x55555555) + ((data >> 1) & 0x55555555);
data = (data & 0x33333333) + ((data >> 2) & 0x33333333);
data = (data & 0x0F0F0F0F) + ((data >> 4) &am……
[/Quote]

统计一个32位的数据,里面有多少个1啊,
就是, 第1次是8组数据相加,然后是四组,然后是2组,然后是1组数据相加.就可以得出总共有多少个1了
烈火蜓蜻 2012-09-02
  • 打赏
  • 举报
回复
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吧
abc10486 2012-09-02
  • 打赏
  • 举报
回复
public static Int32 GetSignin(Byte index)
{
return (Byte)(_Signin >> index & 1);
}

public static void SetSignin(Byte index, Byte value)
world13 2012-09-02
  • 打赏
  • 举报
回复
谢谢啦。多谢上面的兄弟了。我会思考这个问题的。
SocketUpEx 2012-09-02
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 的回复:]
所以"只好"在弄一个月份字段
[/Quote]
我觉得啊
并不是"只好"这么勉强
而且"必须"或者"一定"
楼主就算没有这个每日签到的功能
日期字期也是有的
就算没有日期字段
InputDate之类的录入日志也应该有一个吧


world13 2012-09-02
  • 打赏
  • 举报
回复
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);

这块的逻辑能说说嘛。。。 看的有点晕。。。
wanghui0380 2012-09-02
  • 打赏
  • 举报
回复
这种设计看上去好像技术上挺高级的,但是商业上其实是比较弱智的设计
wanghui0380 2012-09-02
  • 打赏
  • 举报
回复
这种设计比较疯狂啊,半点退路都不给自己留啊

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

客户一拍脑袋说我还要出报表,把每个月的情况直接显示出来,你又傻了。从你这个字段里还根本认不出这是那个月的,所以只好在弄一个月份字段
SocketUpEx 2012-09-01
  • 打赏
  • 举报
回复
嗯嗯
是我错了


world13 2012-09-01
  • 打赏
  • 举报
回复
= = 。我要次数。。传这个干吗。。。
SocketUpEx 2012-09-01
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

要循环才能知道签到次数嘛。。。。
[/Quote]

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


world13 2012-09-01
  • 打赏
  • 举报
回复
要循环才能知道签到次数嘛。。。。
SocketUpEx 2012-09-01
  • 打赏
  • 举报
回复
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();
}
}



world13 2012-09-01
  • 打赏
  • 举报
回复
那有没有知道这个字段已经签到了几次呢??用位移的话。。。谢谢了。。。
Has_Lin 2012-09-01
  • 打赏
  • 举报
回复
用按位或运算就可以了
world13 2012-09-01
  • 打赏
  • 举报
回复
哦。问下插入的时候是怎么进行记录啊。。。比如1号签到。2号没签到。。3号又签到了。。。这个字段应该怎么记录的呀???
烈火蜓蜻 2012-09-01
  • 打赏
  • 举报
回复
上面不是已经可以了吗? 明白了?
world13 2012-08-31
  • 打赏
  • 举报
回复
就是一个字段中记录的是1-31号所有的签到信息。。。。。
烈火蜓蜻 2012-08-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

8421和你的Int有什么关系, 8421还是2421都是系统层面的东西,你需要用到吗?

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

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

// 设置签到
if( mask & data == 0 )
data |= mask;
else
已经签到了,不用再签到
烈火蜓蜻 2012-08-31
  • 打赏
  • 举报
回复
8421和你的Int有什么关系, 8421还是2421都是系统层面的东西,你需要用到吗?

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

int day = DateTime.Now.Day; // 获取日期中的天数,
int data = ....; // 签到情况
int mask = 0x1 << day;
if( mask & data != 0 )
有签到.
else
未签到.
加载更多回复(1)

110,536

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧