EDN首页   博客首页

最新日志

发表于:2008-10-3 12:02:02
标签:无标签

3

关于应用FLASH二次写入防止改写代码问题

在某种场合,有时不得不将Hex文件即程序代码交付对方自己烧写。

这在FLASH的MCU/ARM/DSP上会经常遇见,因为派人到对方现场ISP的费用太高。

故如何防止对方改写代码是我们需要考虑的问题。

这实际是已知代码反汇编源码的问题,如果不加以手段,那么任何反汇编软件

都会反出汇编源码,即使源码是C源码。

那么如何阻止对方反汇编及调试出程序真正的入口地址呢???

FLASH/EPROM大多都可以“二次写入”,即FLASH的某位为‘1’时可继续写入‘0’

但一旦写入‘0’时必须擦除后恢复为‘1’。

那么我们即可利用FLASH这一“特性”来保护真正的代码和数据在对方反汇编及调试时得不到所需结果。

我们可以将真正的代码(入口地址)和数据在HEX文件里让其为‘空’,即0xff/0xffff/0xffffffff

当首次运行时,解开一部分代码或数据,利用内部或外部看门狗复位,再次重复

解开一部分代码或数据...

这样复位N次后,真正的代码和数据才出现在FLASH中,程序才真正可以运行。

由于“解码”需要N次复位,故反汇编和调试工具也就无用武之地了。

实际应用中,一般要把显式调用函数改为结构函数指针调用。即类似COM接口技术。

它实际上是将重要函数的入口地址作为结构中的成员(函数指针表)。

若是我们将其申请为动态的结构指针,结构成员将要动态装载(函数指针表),这样

我们即可将“解码”后的“数据”装载即可完成。

如何防止代码被改写呢???这实际是个很简单的算术问题。

假入真正的数据或代码为(前3位):

01 02 03 FF.

求和为0B.

由于不为0,我们认为未“解码”。

由于“惧怕”反汇编及调试跟踪“断点”,故不能去判断这个0B不为0是错误!!!

应该将此值去对函数指针表进行“解码”运算,因为正确为0,那么+或^实际

函数指针表会不变的!!!

由于debug时,很难发现IAP调用,即FLASH二次写入,故用0B去“解码”肯定不对。

所以我们只需将FF二次写入F5即可得到:

01 02 03 FA

这样求和为0。

假若这个FA隐藏在别处,或为其他“解码”所用,那么对方想改写源代码,即

想改写01 02 03都会出错。这就达到了我们利用FLASH二次写入保护代码的目的。

假若用CRC等算法和多次复位加载等,对方“解码”难度肯定增强。

当然本主题是在MCU不被解密的前提下,HEX文件的保护问题。

 

点击此处查看原文 >>

系统分类: ARM   |    用户分类: 无分类    |    来源: 原创

评论(0) | 阅读(283)
发表于:2008-9-24 1:00:35
标签:无标签

0

一维数组和两维数组的关系

hotpower 发表于 2008-9-24 00:47 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

楼主: 一维数组和两维数组的关系

一维数组:matr1[K]
char data matr1[6]=
{
  00,01,0x10,0x11,0x20,0x21
};

其中:matr1[k]
matr1[0]=0,matr1[1]=1,matr1[2]=0x10...matr1[5]=0x21

两维数组:matr2[M][N]
char data matr2[3][2]=
{
  {00,01},
  {0x10,0x11},
  {0x20,0x21}
};
其中:matr2[m][n]
matr2[0][0]=0,matr2[0][1]=1,matr2[1][0]=0x10...matr2[2][1]=0x21

它们的关系为:
k = m*N + n  (其中:k=0~K-1, m="0"~M-1, n="0"~N-1)

即当matr1和matr2的存储地址相同时,就有:
matr1[0]等同matr2[0][0]
matr1[1]等同matr2[0][1]
matr1[2]等同matr2[1][0]
matr1[3]等同matr2[1][1]
matr1[4]等同matr2[2][0]
matr1[5]等同matr2[2][1]

那么matr2[2][2]又是什么呢???
因为matr2定义为char data matr2[3][2]即M=3,N=2
那么matr2[2][2]即matr2[m][n].这里m=2,n=2(已经不满足n=0~N-1的条件)

所以matr2[2][2]应该属于非法访问,这在很多编译器编译时会报错误的!!!

但也有些编译器却可通过,实在是倒塌~~~

那么matr2[2][2]访问在何处???

根据一维数组和两维数组的关系:
k = m*N + n  (其中:k=0~K-1, m="0"~M-1, n="0"~N-1)

可知:
k = 2*2+ 2 = 6,即matr2[2][2]等同matr1[6].即matr1一维数组的第7个单元.

所以matr2[2][2]越界.


实际应用中,编译器都会先把两维数组用k = m*N + n转换为一维数组的.

而且可能还转换为指针.

所以在很多实际应用中,一维数组可能是不错的选择.

菜农不想加入以下21ic数组战斗贴,故写此贴以示自己的看法:

http://bbs.21ic.com/club/bbs/list.asp?Page=1&boardid=11&t=3099691

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 原创

评论(0) | 阅读(370)
发表于:2008-9-14 10:15:37
标签:无标签

2

如何防74164干扰

http://bbs.ednchina.com/ShowTopic.aspx?id=59624

#1 楼主:如何防74164干扰 精华帖

贴子发表于:2008-5-28 10:55:56

我是一名电子爱好者,一个月前用51单片机和74164做了一款单片机显示,74164后接LED灯,就是单片机和74164传数据时有干扰,调试了很长时间,还没调试出来,单独调试74164时有干扰,请各位师兄,师姐帮帮忙阿!!

#11 上万台和15年以上的实战经验

贴子回复于:2008-9-14 10:13:24

1.在数据和时钟线上各对地接1只小电容,我用300p左右,最早用681P


2.发送完串行数据串后将时钟线拉低。


3.每半秒刷新整个LED阵列一次。

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 整理

评论(0) | 阅读(321)
发表于:2008-9-9 22:04:44
标签:无标签

1

毛泽东,为什么今天仍然有人为你疯狂?(转帖)

http://blog.ifeng.com/article/1699338.html

毛泽东,为什么今天仍然有人为你疯狂?

访问量[794136] 评论数[6433]

发布于:2008-09-09 07:38

毛泽东,为什么今天仍然有人为你疯狂?

司马平邦

我最喜欢的一张标准像

哎,这个标题《今天,为什么仍然有人为……疯狂?》似曾相识啊!

我也相信,现在,真的有许多人在写博纪念毛泽东,有许多的标题可能都是这样的《今天,为什么仍然有人为……疯狂?》的格式。

这就是毛泽东,他死去32年来,就一直让我们不停地于他的每个纪念日就以这样的方式不断向自己设问,而且我们也一直没有找到过标准答案。

但如果不为他写点儿什么,都会觉得对不起自己。

无论是爱他的、敬他的、怕他的、恨他的、想念他的、想忘记他的,人们,都会在每个9月9日到来的时候,忽然而然地想到他,这让人无法释怀,那是一种怎样的情绪,相信现科学的思想家,再激情的科学家和再深刻的思想家,都不能尽然说清楚,毛泽东用他不长不短的83年生命给中国人留下了足以思考500年甚至1000年的东西,搞明白了毛泽东,也就搞明白了中国和中国人。

今天,我相信一定又有许多人会去天安门广场的毛主席纪念堂去怀念他了,但人群又比从前少了一个人,华国锋。

现在,毛泽东,已经不再只代表一个人,一种主义,一派身份,而更代表一种方法。

中国人骨子里自负大于自卑心理可能从唐朝之后就开始了,到清末为最,到了几站可以忍受人家在自己头上拉屎撒尿还得笑出声来的程度,如果没有毛泽东1949年那句“站起来了”,还不知我们要忍多久呢。

这时,我倒要想想,未来毛爷爷会不会成为关二爷一样的民族图腾?

有可能吧。

因为中国人的后代,在毛泽东身上附着了一种尤其是面对外侮的尊严状态,他可以把所有帝国主义当成纸老虎,他是这么说的,也是这么做的;在他步履蹒跚的晚年,他仍然可以挥动一只巨手让全世界为他暴风骤雨电闪雷鸣,他一辈子只去过两趟苏联,但却熟知世界上一切运行规律,像个真正的超人。

毛泽东的才气,是他令世界尽折腰的一个重要理由,让他的名字在后代仍然引发无数的个人崇拜。

当人们需要一个崇拜的时候,毛泽东就是一个最好的选择――只要在人真正“万能”之前,谁又能离开“崇拜”呢?

纵横几万里,让下几千年,能把思想、诗情、兵法、权谋和幸运如此统一在一起的,除毛泽东找不到第二个,他有点儿像上帝亲自的造化,他是一个这样的中国人--一个可以放在任何一种伟人参照系里都能排在前三位的那个人;当年他带着一群赤手空拳的泥腿子夺取了世界人口最多的国家的政权,那20多年的奋斗历程在1000年后将被传说成斯巴达克思战记,在2000年后将被传成秦皇汉武卸宇大传,而3000年后将被传说成封神演义和奥林匹亚诸神记,而这些传奇无疑都将起到一个作用,激励无数的模仿者奋然向前,虽然他们中的绝大多数一代一代仍将都将遭到失败的命运。

列宁是在马克思死后许多年取得俄罗斯领导权的,马克思也是在列宁取得政权之后才成为马克思的,当我们自己都觉得毛泽东作为一个意识形态的名词行将过时的时候,在几千万人的尼泊尔居然出来一支打着“毛主义”旗号的游击队也取得了国家的领导权,当他的领导者普拉昌达带着一脸虔诚来到“毛主义”的发源地朝圣时,我们甚至都找不到接待这样的客人的适当方式。

在全世界,你细想想,除了毛泽东,找不到任何一种可以征服中国以外地区的人们的中国人的思想,更别说让他们对着他们根本不认识的5个汉字“为人民服务”宣誓,然后为所谓的主义赴汤蹈火了。

谁能保证再过一些年会不会有更多的毛主义游击队重走普拉昌达分子的老路呢?我刚刚在报纸上看到的消息是尼泊尔已经开始了几百年来最大规模的解放佃农的土改运动,没想到“打土豪分田地”也会有如此实际的意义,而谁又能肯定,随着社会财富的不断增加的贫富差距的不断扩大,中国,或者世界更多的所谓的和平繁荣最后会不会还将走向“打土豪分田地”呢--也许当世界再度证明毛泽东的伟大的时候,现在活着的人都已死去。

上周参加一个小型的论坛,谈俄罗斯和格鲁吉亚之间的战争,会上一个年轻的朋友,居然拿出一套毛泽东的思想对今天的中国进行了系列解析,让与会者目瞪口呆,其实除了他的这种愤世嫉俗的样子让人会想到文革外,他的论调是有道理的,是啊,那么多看似复杂的问题早被毛爷爷一语道破,愚惷的国人有的时候为什么要矫情至装糊涂绕来绕去呢?

现在,真正被称为所谓“毛派”的中流更是一群年轻人,而“毛派”则是这群人既自豪又鄙视的一个概括,他们以毛泽东为荣,也以某些人用这样的称谓概括自己为不齿,是啊,真正崇敬毛泽东的,都关心国家心怀民族,在他们心中,毛泽东与中国是紧密一体的,谈何派系?他是这个国家的一段值得珍视的骄傲,虽然在那段骄傲里也有人事斗争,也有民生苦难,也有吃不饱穿不暖。

毛泽东这个名字必能长久红火下去,在于它将在每一代最富激情和中国年轻人身上得到激发,他的名字也可能在以后的岁月里起到维系这个国家的年轻人对国民身份认同的作用,与秦皇汉武唐宗宋祖站在一起时,他是这个民族的神圣帝王,与陈胜吴广李自成岳飞站在一起时,他是这个民族的英雄好汉,与孔丘李杜八大文豪站在一起时,他又是这个民族的精神偶像;即使是现在,“毛泽东”、“毛主席”、“毛爷爷”业已成为政治、文化、经济、艺术元素,被镶嵌在中国的任何城市任何农村的任何一个角落,人们已经从神化毛泽东的时期猛醒回来,但又发现,他被还原成“人”以后,可能比当年那个“神”更有影响力。

崇拜和批判,对毛泽东本人其实已经没有任何意义,就是把纪念堂里他枯萎了32年的躯体化为乌有,对毛泽东本人也已没有任何意义,其实对他的崇拜或者批判,都是出于当前人的渴望和需要,而毛泽东,在他死后32年或者320年仍然有本事填补你在现实中无法满足的需要。

对,说到底是需要。

这是一个越来越加自由的时代了,但随着时代的越发自由,对毛泽东的追寻和崇拜可能也会越来越自由,人们越来越自由地用自己的方式怀念毛泽东,我甚至想再过些年,9月9日老人家的逝世日或者12月26日老人家的诞辰日也许会成为一个重要的民间纪念日,成为第二个端午节流传下去,我们不一定去主动推动,但仍然乐见其成。而只要总结一下,仍然有这么多毛泽东说过的话适用于今天的中国,我相信有些话会如孔夫子的“三人行必有我师”一样无数年地流传下去:

有一回哥老会抢了我家,我说,抢得好,人家没有嘛――太潇洒了吧。

国民经济的两个拳头,一个屁股。基础工业是一个拳头,国防工业是一个拳头,农业是屁股――送给现在的中国领导人。

鸡蛋因适当的温度而变化为鸡,但温度不能使石头变为鸡――他说起来简单,你理解起来挺难。

打得赢就打,打不赢就走――最真实最实用的军事游击名言。

党外无党,帝王思想,党内无派,千奇百怪――出口成章,才华横溢。

敌进我退,敌驻我扰,敌疲我打,敌退我追――最真实最实用的军事游击名言,许多组织靠它可以打下天下。

敌人一天天烂下去,我们一天天好起来――如果是别人说的就是梦呓,因为是老人家说的,就是哲言。

多少事,从来急,天地转,光阴迫,一万年太久,只争朝夕――真理与文学的完美组合句。

帝国主义是纸老虎――是说给胡温和所有中国的后代领导人听的。

一切反动派都是纸老虎――同上。

凡是敌人反对的,我们就要拥护;凡是敌人拥护的,我们就要反对――最准确的民族主义加上最实用的斗争哲学。

搞一点原子弹、氢弹、洲际导弹,我看十年完全可能――除他之外,没人敢这么说。

革命不是请客吃饭,不是做文章,不是绘画绣花,不能那样雅致,那样从容不迫,“文质彬彬”,那样“温良恭俭让”。革命就是暴动,是一个阶级推翻一个阶级的暴烈的行动――巨手如轮,真理如火,就这样把世界给改变了。

高贵者最愚蠢,卑贱者最聪明――最平易的哲理。

核战争打不起来――老人家早看透了这世上一切。

好好学习,天天向上――没有比这句更慈祥更实用的校训了。

基本粒子也是可分的――他不是科学家,但他是哲学家,比科学家高明许多。

历史是人民创造的――敢于解析一个谁也讲不清的道理。

独立寒秋,湘江北去,橘子洲头――网上评论,最酷的一句词。

不是东风压倒西风,就是西风压倒东风――适用于中国处理国际关系,适用于奥运会前,也适用于奥运会后。

不到长城非好汉――最有影响力的当代励志名言。

彻底的唯物主义是无所畏惧的――大多知识层的自我标榜,自我激励。

农村是一个广阔的天地,在那里是可以大有作为的――同样适用于今天。

农村包围城市,武装夺取政权――世界上许多人在执行,许多人为这句话而生,为这句话而死,比如普拉昌达和格瓦拉。

马克思主义的道理千条万续,归根结底就是一句话,造反有理――振聋发聩。

没有调查就没有发言权――最实用的生活哲理。

美帝国主义想打多久,我们就打多久!――靠,牛逼的极致。

美国可能对中国实行和平演变――果然如此。

哪里有压迫,哪里就有反抗——毛泽东

群众是真正的英雄――送给今天的中国精英们。

枪杆子里面出政权――一条千古不变的真理。

前途是光明的,道路是曲折的――最适合自我激励。

人不犯我,我不犯人;人若犯我,我必犯人――他老人家咋想出来的的?

扫帚不到,灰尘照例不会自己跑掉――大家都明白,但只有毛泽东把它说成了哲理。

石达开没有走通的路,我们一定能走通――这辈子不信邪,而成败全由之。

世上无难事只要肯登攀――我最相信的一句话。

世界是你们的,也是我们的,但是归根结底是你们的。你们青年人朝气蓬勃,正在兴旺时期,好像早晨八九点钟的太阳,希望寄托在你们身上――这样一个普通的道理,被他说来就让人激动万分。

三十年前您是我的老师,三十年后的今天,您仍然是我的老师――师生关系的最好写照。

世界上怕就怕“认真”二字,共产党就最讲认真――但愿现在的共产党能常回想这句话

世界上没有无缘无故的爱,也没有无缘无故的恨――真理,从男女恋爱到国家交往全然适用。

首先,苏联、美国是第一世界;其次,中间派,日本、欧洲、加拿大,是第二世界;最后,亚洲(除了日本)、非洲和拉丁美洲是第三世界――中国应永远保持第三世界的骨血和气质。

生的伟大,死的光荣――对一个人的至高表扬莫过于此。

天要下雨,娘要嫁人,由他去吧――老人家在无奈的时候,也不忘甩一甩才华,这是让我们为他折服的理由。

我们不但善于破坏一个旧世界,我们还将善于建设一个新世界――无所不为,无所不敢为,典型的个人风格。

无限风光在险峰――最准确的晚年心境。

为人民服务――已经成为世界上“毛主义”信条的5个字。

为有牺牲多壮志,敢教日月换新天――才情、深情与激情的完美组合句。

向雷锋同志学习――不敢相信,这么简单的一句话,怎样改造了几代人的灵魂,不是雷锋让人疯狂,而是这句话让人疯狂。

星星之火,可以燎原――星星之火的吹牛,不想最后真的做到了燎原。

中国永远不称霸――但也不能被欺负,他是这么说的,也是这么做的。

中国的抗战要打七八年――这是句让他成为伟人的论断。

自己动手,丰衣足食――最有志气的一句话。

自信人生二百年,会当水击三千里――少年即负壮志,送给现在的80后90后。

战略上要蔑视敌人,战术上要重视敌人――太有用的,被无数人引用。

只有大量地消灭敌人,才能更好地保存自己――毛泽东最事夺取政权的法宝,孙子兵法之外的最有价值军事格言。

真理有时在少数人手里――就是这句话掀动了对他的全国性个人崇拜。

不要考试,考试干什么?一样不考才好呢!对于考试一概废除,搞个绝对化――为什么让我现在看到它,而不是中学时代?

从前我在学校里是不守规矩的,只是以不开除为原则的――说到学生心里去了。

再斗十年,地球照样转动,天也不会掉下来――呵呵,果然如此。

谦虚使人进步,骄傲使人落后――简单的语气,深刻的哲理。

消灭了敌人的同时,也就等于消灭了自己――一辈子斗争的总结,可以指导许多人搞各种各样的斗争。

用革命的两手,对待反革命的两手――我把它改成“对待流氓要比他还流氓”。

友谊第一,比赛第二――残奥会最该挂的标语,比什么“同一个世界,同一个梦想”有意义多了。

宜将剩勇追穷寇,不可故名学霸王――他说过的最深奥的话之一。

与天斗其乐无穷,与地斗其乐无穷,与人斗其乐无穷――关键是后面的“其乐无穷”。

中国取得独立之后,可能大规模引进外资――邓小平帮他办到了。

中国人民从此站起来了――这句话可以让中国再自豪100年。

勇敢分子也要利用一下嘛!我们开始打仗,靠那些流氓分子,他们不怕死。有一个时期军队要清洗流氓分子,我就不赞成――我党成功的一个灰色经验,只有毛爷爷敢于承认。

雄关漫道真如铁,而今迈步从头越――适用于所有失败和成功。

这个军队具有一往无前的精神,它要压倒一切敌人,而决不被敌人所屈服――他仍然掌握着中国军队的根系。

下定决心、不怕牺牲、排除万难、去争取胜利――战无不胜的意志,排山倒海的修辞。

点击此处查看原文 >>

系统分类: 自由话题   |    用户分类:    |    来源: 转贴

评论(0) | 阅读(254)
发表于:2008-9-9 13:41:32
标签:无标签

2

菜农1976年的今天

http://bbs.21ic.com/club/bbs/list.asp?boardid=17&t=3088904

32年前的昨晚,菜农和两位同学在院子里聊天,突然一个大火球从西南方向向东北

方向划过,当时我们三人很是吃惊~~~

32年前的今天下午,整日逃学的小菜农到西北体育场看陕西和空军队的比赛....

由于无银两无收入的17岁小菜农只好在铁栏外艰难地观看~~~

好不容易到了中场休息,铁栏打开,无数球迷们站在高坡上随地"喷水"~~~

俺终于可以进场看球了~~~(俺都找到规律了,中场可以随便进场)

可是刚坐稳还没热乎,4点正广播里传来了我们那一代人都不愿听到的深沉的声音

和那不愿听的乐曲...

纪念32年前难忘的今天!!!

毛泽东---菜农心中永远的偶像和伟人!!!

 

HotPower@126.com    2008.9.9

点击此处查看原文 >>

系统分类: 自由话题   |    用户分类:    |    来源: 原创

评论(1) | 阅读(264)
发表于:2008-9-9 0:33:45
标签:无标签

4

揭露“心算星期”骗人的把戏

汽车电子 发表于 2008-9-8 22:52 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

6楼: 实际上用查表法很简单

   1年只需12个字节,100年只需1200字节,如果用压缩BCD只需600字节,再找规律压缩一下,更省空间。那些复杂的算法可能不止600字节哦。
   月历表中1号前有几个空格(即偏差值,星期天不算),日期除以7的余数,加上空格数,就是星期数,太简单了。

    例:2008年9月8日  本月月历表中1日前面空格为0(星期天不算),8%7=1,1+0=1,即是星期一;      
   2032年9月8日  本月月历表中1日前面空格为2(星期天不算),8%7=1,1+2=3,即是星期三;
    
   公式:   日期%7 + 偏差  (偏差来自表格)

   再变一下,取余数除法都不需要,大于等于7就减去7......

   偶读初中的时候就用这个方法“在同学面前耍聪明”
   
hotpower 发表于 2008-9-9 00:30 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

7楼: “在同学面前耍聪明”~~~实际在骗人~~~

某日星期几=(百年%4*5+年+年/4+月星期表+日)%7

通用星期偏差表(此表是菜农公式中的(13*M+8)/5)
闰年  1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 13月 14月 3月 4月 5月  
天数   31  29  31  30  31  30  31  31  30  31   30   31   32   29  32  30   31
星期   5   1   2   5   0   3   5   1   4   6    2    4     0    3   5   1    3

平年  1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 13月 14月 3月 4月 5月  
天数   31  28  31  30  31  30  31  31  30  31   30   31   32   28  32  30   31
星期   6   2   2   5   0   3   5   1   4   6    2    4     0    3   5   1    3

例如2008年的“骗术”

根据星期表查表公式:

某日星期几=(百年%4*5+年+年/4+月星期表+日)%7
          =(20%4*5+08+08/4+月星期表+日)%7
          =(0+10+月星期表+日)%7
          =(3+月星期表+日)%7
查2008.9.8

因为9月表=4,故(3+月星期表+日)%7=(3+4+日)%7=(0+日)%7
即9月的日就是“星期”

所以你就会“聪明”地立即“说出”2008.9.8是星期一(8=7+1=0+1=1)

2008.1.8如何查表???

这里有2种查法。
注意顶部的通用星期偏差表的1月2月和13月14月,
1月2月需要知道今年是否闰年,13月14月不需要,但要将年-1。

1.不需知道闰年的查法
  因为是1月,需要变换为13月或5月,且年变换为2007年。
  即需要查2007年的13月的8日是星期几。
某日星期几=(百年%4*5+年+年/4+月星期表+日)%7
          =(20%4*5+07+07/4+月星期表+日)%7
          =(0+8+月星期表+日)%7
          =(1+月星期表+日)%7
          =(1+13月星期表+日)%7
          =(1+0+日)%7
故2008.1.8是(1+8)%7=(2+7)%7=2


2.需知道闰年的查法
因为2008是闰年,故需要查闰年表
某日星期几=(百年%4*5+年+年/4+月星期表+日)%7
          =(20%4*5+08+08/4+月星期表+日)%7
          =(0+10+月星期表+日)%7
          =(3+1月星期闰年表+日)%7
          =(3+5+日)%7
          =(1+日)%7
故2008.1.8是(1+8)%7=(2+7)%7=2
  
哈哈~~~这种“心算”骗人的把戏就是当知道年月时,日+偏差就是星期~~~

点击此处查看原文 >>

系统分类: 单片机   |    用户分类:    |    来源: 整理

评论(1) | 阅读(192)
发表于:2008-9-7 16:50:01
标签:无标签

2

菜农气晕数学界的(13*M+8)/5推导过程

hotpower 发表于 2008-9-7 16:49 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

24楼: 菜农气晕数学界的(13*M+8)/5推导过程

首先声明菜农不喜欢数学,更不是数学家~~~

刚找到当年(13*M+8)/5)推导过程的“手稿”。它要从月星期表说起

通用星期偏差表(此表是菜农公式中的(13*M+8)/5)
分组           大  小  大  小  大  大  小   大   小   大   大   小  大  小  大
闰年  1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 13月 14月 3月 4月 5月  
天数   31  29  31  30  31  30  31  31  30  31   30   31   32   29  32  30   31
星期   5   1   2   5   0   3   5   1   4   6    2    4     0    3   5   1    3
星期差         3   2   3   2   3   3   2   3    2    3     3    2   3   2    3

分组           大  小  大  小  大  大  小   大   小   大   大   小  大  小  大
平年  1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 13月 14月 3月 4月 5月  
天数   31  28  31  30  31  30  31  31  30  31   30   31   32   28  32  30   31
星期   6   2   2   5   0   3   5   1   4   6    2    4     0    3   5   1    3
星期差         3   2   3   2   3   3   2   3    2    3     3    2   3   2    3

由于明年的1月(13月)和今年5月的月表值都是0,2月(14月)和今年6月的月表值都是3
故月表简化为:
通用星期偏差表(此表是菜农公式中的(13*M+8)/5)
分组           大  小  大  小  大  大  小   大   小   大
年           3月 4月 5月 6月 7月 8月 9月 10月 11月 12月   
                      1月 2月
天数           31  30  31  30  31  31  30  31   30   31  
                       31  28/29  
星期值         2   5   0   3   5   1   4   6    2    4  
星期差         3   2   3   2   3   3   2   3    2    3  

可以看出"分组"为两组(大月小月大月小月大月),每5(记住这个"5")个月1组(注意1月2月划归为5月6月):
3月 4月 5月 6月 7月 和 8月 9月 10月 11月 12月
星期差同为:3   2   3   2   3

星期差求和=3+2+3+2+3=13(记住这个"13")

再对12个月的星期值求和=0+3+2+5+0+3+5+1+4+6+2+4=40
由于每5个月1组,则40/5=8(记住这个"8")

因为原查表算法为:
某日星期几=(百年%4*5+年+年/4+月星期表+日)%7

所以要琢磨出:
    月星期表 = ((13*M+8)/5)%7
    
因为每5个月1组,故肯定有((aM+b)/5)%7或((aM+b)%5)%7存在。
但是((aM+b)%5)%7可化简为(aM+b)%5,结果只有0,1,2,3,4.这肯定不过!!!

所以((aM+b)/5)%7将是推导的框架!!!

哈哈~~~"5"用到了。该"13"和"8"上阵了。

参数只有a,b.代入((aM+b)/5)%7几次即可搞定((13*M+8)/5)%7~~~

哈哈~~~菜农没文化让大家见笑了~~~搞笑~~~绝对的"非典"

菜农的"推导过程"绝对气晕数学教授,不过俺数学不好也难为菜农胡思乱想了~~~

点击此处查看原文 >>

系统分类: 软件开发   |    用户分类:    |    来源: 原创

评论(2) | 阅读(471)
发表于:2008-9-7 9:51:56
标签:无标签

1

菜农星期公式揭秘及蔡勒公式推想

讨论及论证过程详见:http://bbs.21ic.com/club/bbs/list.asp?boardid=11&page=1&t=3063061

今日方敢自称菜农星期算法为“菜农星期公式”~~~

 

因为“菜农公式”竟然与“蔡勒公式”结果完全相同!

哈哈~~~不同菜农就栽了~~~

结果当然必须相同,但过程和推导方法虽然雷同,可公式的优化和“物理意义”及“路径”差距很大。

菜农不知蔡勒(Zeller)是何须人也,也不知是“什么朝代”人士,

也不想知道~~~估计也是“卖脑浆的主”~~~

首先对比2个算法:

蔡勒公式如下:

W = [C/4] - 2C + y + [y/4] + [13 * (M+1) / 5] + d - 1
或者是:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1

菜农补充“完整的蔡勒公式”:

W = (203 + C/4 - 2C + y + y/4 + 13 * (M+1) / 5 + d - 1) % 7
或者是:w=(203+y+y/4+c/4-2c+26(m+1)/10+d-1)%7
其中:C<=99,w在加203后不会出现负数

菜农公式如下:

W = (C%4*5+Y+Y/4+(13*M+8)/5+D)%7

菜农的(13*M+8)/5是根据月星期表推导出的。

菜农依据表的万年某日星期算法:  
   公式:某日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7
   通用星期偏差表
   闰年  1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
   天数   31  29  31  30  31  30  31  31  30  31   30   31
   星期   3   6   0   3   5   1   3   6   2   4    0    2
   平年  1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
   天数   31  28  31  30  31  30  31  31  30  31   30   31
   星期   4   0   0   3   5   1   3   6   2   4    0    2
或(1月2月为5月6月星期表):

   公式:某日星期几=(百年%4*5天+年+年/4+月星期表+日-0天)%7
   通用星期偏差表(此表是菜农公式中的(13*M+8)/5)
   闰年  1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
   天数   31  29  31  30  31  30  31  31  30  31   30   31
   星期   5   1   2   5   0   3   5   1   4   6    2    4
   平年  1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
   天数   31  28  31  30  31  30  31  31  30  31   30   31
   星期   6   2   2   5   0   3   5   1   4   6    2    4

故蔡勒用的星期表为(1月2月为13月14月星期表):

   公式:某日星期几=(百年/4-2*百年+年+年/4+月星期表+日-1天)%7
   蔡勒星期偏差表(此表是蔡勒公式中的13*(M+1)/5)
   闰年  1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月 13月 14月
   天数   31  29  31  30  31  30  31  31  30  31   30   31   31   29
   星期   5   1   2   5   0   3   5   1   4   6    2    0    3    5   
   平年  1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月  13月 14月
   天数   31  28  31  30  31  30  31  31  30  31   30   31   31   28
   星期   6   2   2   5   0   3   5   1   4   6    2    0    3    5

根据21ic网友xwj的推导:

xwj 发表于 2008-9-6 19:56 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

18楼: 典型的1阶比例计算,公式可以这样简化:

蔡勒公式如下:
W = [C/4] - 2C + y + [y/4] + [13 * (M+1) / 5] + d - 1
或者是:w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1

w=y+[y/4]+[c/4]-2c+[26(m+1)/10]+d-1
-->>
w=(5/4)y -(7/4)c +(26/10)m +26/10 +d -1
-->>
w=(5/4)y -(7/4)c  +d +(26/10)m +16/10
-->>
w=(5/4)y -(7/4)c  +d +(26m+16)/10

-->>
w=(5/4)y -(7/4)c  +d +(26m+16)/10 +N个7

xwj 发表于 2008-9-6 20:12 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

19楼: 考虑取值范围,为了避免溢出,机器最后可以这样计算:

w=y +y/4 -c*7/4  +d +(13*m+8)/5 +N个7

当C<=99时,2*C<=198,为使蔡勒公式不出现负数,取N=29即N*7=203

故有蔡勒公式的完整表述:

W = (203+C/4-2*C+Y+Y/4+(13*M+8)/5+D)%7

 

注意反推(13*M+8)/5+D到13*(M+1)/5+D-1
(13*M+8)/5+D=(13*M+8+5-5)/5+D
            =(13*M+13)/5-5/5+D
            = 13*(M+1)/5+D-1

对比菜农公式:

W = (C%4*5+Y+Y/4+(13*M+8)/5+D)%7

难道(203+C/4-2*C)%7和(C%4*5)%7相等吗???

编过计算机程序的人一眼可以看出C%4*5的表述实际为:

(C&3)*5

或((C&3)<<2)|(C&3).

即把C的值取低2位(D1D0)复制到高2位(D3D2)

因为C&3=0~3或00B~11B

所以C%4*5只有4个取值0(0000B),5(0101B),10(1010B),15(1111B)

则((C%4)*5)%7对应0,5,3,1

可以看出C%4*5的表述和“物理意义”非常清晰:

hotpower 发表于 2008-9-6 09:34 侃单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖

12楼: 这个算法实际是把月星期表进行了代换

月星期表+日+2天 等效为公式 (13 * m + 8)/ 5

再“转帖”我当时的“四百年历”的帖子:
推导过程:
1。平年365天(52周+1天),闰年366天(52周+2天)。平年2月28天,闰年2月29天。
   由于公元1月1日设为星期六,故3月1日为星期三。         ——注意这个“三”
   为使算法达到最简,故本算法以“星期”为计算单位。且选3月1日为基月。
2。每400年整一闰,或每4年且不为百年的一闰。
   百年%4=0闰或(年%4=0并且年<>0)闰。
3。每 4年(3个平年+1个闰年)共208周+5天                  ——注意这个“5天”
   每百年共100*(208周+5天)-1天=5217周+5天              ——注意这个“5天”(整
百年暂设为平年)
   每400年共4*(5217周+5天)+1天(整400年闰)=20871周+0天——注意这个“0天”和
“1天”(4个整百年只有一个闰年)
   即400年一轮回!(原来万年历400年前是一家)
4。万年3月1日星期算法(记住那个三)
   公式:某年3月1日星期几=(3天+百年%4*5天+年/4*5天+年%4+月星期表+日-1天)%7
         某年3月1日星期几=(百年%4*5天+年/4*5天+年%4+月星期表+日+2天)%7
   或    某年3月1日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7
   
   闰4百年3月1日星期算法(百年%4=0)
   公式:某年3月1日星期几=(年+年/4+月星期表+日+2天)%7
   例:0000年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三
       1600年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三
       2000年3月1日星期几=(0+0/4+0+1+2)%7=3%7=星期三
       2001年3月1日星期几=(1+1/4+0+1+2)%7=4%7=星期四
       2004年3月1日星期几=(4+4/4+0+1+2)%7=8%7=星期一
       2008年3月1日星期几=(8+8/4+0+1+2)%7=13%7=星期六
       2042年3月1日星期几=(42+42/4+0+1+2)%7=55%7=星期六

   平4百年3月1日星期算法(百年%4<>0)
   公式:某年3月1日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7
   例:1700年3月1日星期几=(17%4*5+0+0/4+0+1+2)%7=8%7=星期一(注意:1700年是平
年)
       1800年3月1日星期几=(18%4*5+0+0/4+0+1+2)%7=13%7=星期六(注意:1800年是平
年)
       1900年3月1日星期几=(19%4*5+0+0/4+0+1+2)%7=18%7=星期四(注意:1900年是平
年)
       1901年3月1日星期几=(19%4*5+1+1/3+0+1+2)%7=19%7=星期五
       1918年3月1日星期几=(19%4*5+18+18/4+0+1+2)%7=(15+22+3)%7=40%7=星期五
       1958年3月1日星期几=(19%4*5+58/4*5+58%4+3)%7=(15+70+2+3)%7=90%7=星期六
       1988年3月1日星期几=(19%4*5+88/4*5+88%4+3)%7=(15+110+0+3)%7=128%7=星期二
       1999年3月1日星期几=(19%4*5+99/4*5+99%4+3)%7=(15+120+3+3)%7=141%7=星期一
       2100年3月1日星期几=(21%4*5+0/4*5+0%4+3)%7=(5+0+0+3)%7=8%7=星期一(注意:
2100年是平年)
       2101年3月1日星期几=(21%4*5+1/4*5+1%4+3)%7=(5+0+1+3)%7=9%7=星期二
       2102年3月1日星期几=(21%4*5+2/4*5+2%4+3)%7=(5+0+2+3)%7=10%7=星期三
       2103年3月1日星期几=(21%4*5+3/4*5+3%4+3)%7=(5+0+3+3)%7=11%7=星期四
       2104年3月1日星期几=(21%4*5+4/4*5+4%4+3)%7=(5+1+0+3)%7=9%7=星期二(注意:
2104年是闰年)
       9999年3月1日星期几=(99%4*5+99/4*5+99%4+3)%7=(120+15+3+3)%7=141%7=星期一
   注:按400年一轮回!(400年前是一家)的说法
       1600年,2000年是一样的
       1700年,2100年是一样的
       1800年,2200年是一样的
       1900年,2300年是一样的
       所以,万年历实际上是骗人的,应该叫“四百年历”才是。万只是多的意思罢了。
5. 万年某日星期算法  
   公式:某日星期几=(百年%4*5天+年+年/4+月星期表+日+2天)%7
   通同星期偏差表
   闰年  1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
   天数   31  29  31  30  31  30  31  31  30  31   30   31
   星期   3   6   0   3   5   1   3   6   2   4    0    2
   平年  1月 2月 3月 4月 5月 6月 7月 8月 9月 10月 11月 12月
   天数   31  28  31  30  31  30  31  31  30  31   30   31
   星期   4   0   0   3   5   1   3   6   2   4    0    2



可以看出:
月星期表实际是根据(闰年/平年,天数)得到星期数的。
它实际是个固定的数,只要分清闰年/平年即可。

新算法:星期=(百年%4*5+年+年/4+(13*月+8)/5+日)%7
旧算法:星期=(百年%4*5天+年+年/4+月星期表+日+2天)%7

昨日首次“拜读”了蔡勒公式,对-2C一直迷茫~~~

既然((C%4)*5)%7对应0,5,3,1

那么(203+C/4-2*C)也对应0,5,3,1???

C=0, (203+0/4-2*0)%7=203%7=0

C=1, (203+1/4-2*1)%7=(203-2)%7=5

C=2, (203+2/4-2*2)%7=(203-4)%7=3

C=3, (203+3/4-2*3)%7=(203-6)%7=1

C=4, (203+4/4-2*4)%7=(203+1-8)%7==(203+0)%7=0

C=5, (203+5/4-2*5)%7=(203+1-10)%7=(203-2)%7=(203+5)%7=5

C=6, (203+6/4-2*6)%7=(203+1-12)%7=(203-4)%7=(203+3)%7=3

C=7, (203+7/4-2*7)%7=(203+1-14)%7=(203+1-0)%7=(203+1)%7=1

C=8, (203+8/4-2*8)%7=(203+2-16)%7=(203-14)%7=(203+0)%7=0

 

晕呀!!!

蔡勒公式中的-2C竟然是想得到重复的0,5,3,1序列采取的“手段”

 

最后还有个1月2月变换问题,蔡勒公式取13月14月,菜农取5月6月。

因为菜农公式是在月星期表“进化”而来,又因为13月14月与5月6月的表值相同,

所以最后决定改为1月2月变换为5月6月。

这样做现在看来“物理意义”失去,但当时考虑“月表”的M大于12就不成“月”了.

总之把握:

1月2月为去年的以3月为基月表的表尾。

所以:

公式中出现1月2月的年是“去年”!!!

公式中出现1月2月的月是“明年”!!!(13月14月下一年的1月2月)

这样“去年”和“明年”就“能量守恒”了~~~

到此菜农“反汇编”蔡勒公式终成正果~~~

感觉蔡勒公式确实和菜农公式在思路上有很大的差距~~~

哈哈~~~看来蔡勒“同志”的脑浆还是“白颜色”的~~~

 

最后给出完整的菜农公式:

W = (C%4*5+Y+Y/4+(13*M+8)/5+D)%7

其中:

C=1~XX,Y=0~99,M=1~12,D=1~28/29/30/31

计算时要注意1月和2月的“去年”“明年”变换。

即:

当M=1或2时,M=M+12或M=M+4,Y=Y-1;当结果Y<0时,C=C-1.

哈哈~~刚搜索的:

蔡勒公式最早是由德国数学家克里斯蒂安 · 蔡勒( Christian Zeller, 1822-1899 )在 1886 年推导出的,因此通称为蔡勒公式( Zeller’s Formula )。为方便