首页 综合精选正文

C语言memcpy(memcpy)

综合精选 2024-06-10 20:22:20
导读 d,s是两个字符型指针,分别指向目标传位置和源传位置在判断 if(((long)d | (long)s) & lmask) 中,举个具体的例子假设是32位计算...

d,s是两个字符型指针,分别指向目标传位置和源传位置在判断 if(((long)d | (long)s) & lmask) 中,举个具体的例子假设是32位计算机,字长 word= 32/8 为4,即占4个byte,则lmask = 000……00011则d与s若是对齐的,应只有第三位及更高位不同(从低位算起)则(long)d | (long)s的最低两位一定是00,例如 d = **……**10100 s = **……**00100,则(long)d | (long)s = **……**10100,此时((long)d | (long)s) & lmask = 0,即对齐的话不做if中的语句,直接从整字开始copy内存内容否则,((long)d | (long)s) & lmask 非0,进入if语句:if((((long)d ^ (long)s) & lmask) || (count < lsize)) 中,记住lmask = 000……00011,所以(long)d ^ (long)s指d,s最低两位若完全相同,如都为10,10或者01,01,或者11,11,(不可能同时为00,00),则((long)d ^ (long)s) & lmask)为假,此时若count>=lsize,即判断为假,则len = lsize - ((long)d & lmask);其中((long)d & lmask)指d中后两位1的个数,为0个,1个,2个或者3个,而lsize - ((long)d & lmask)既是从d开始放,到下一个整字开始前还有几个空位,只能相应的为3个,2个,1个或者0个。

随后的语句是指把先前面的0~3个零头字节复制掉,count -= len; for(; len > 0; len--) *d++ = *s++;否则,若d与s开始时就完全错开,如(10,11)或者(count < lsize),判断为真,指的是若d与s开始时就完全错开,则逐字节复制即可,此时不可整字复制,或者虽然d和s是非整字对齐,如同为01,01,但是copy内容小于lsize(比如是4),不会存在大小为4byte的整字需要复制,则从d开始从头到尾复制即可,即for(len = count / lsize; len > 0; len--)循环中的内容。

for(len = count & lmask; len > 0; len--) *d++ = *s++;因为lmask = 000……00011,则len = count & lmask即字符串的最后0~3个字符,所以最后的for是把整字之外剩余的零头也copy过去讲的比较混乱,按这个思路仔细想象就行了。

Good luck!。

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

头条推荐

C语言memcpy(memcpy)

C语言memcpy(memcpy)

上海地铁11号线站点线路图高清(上海地铁11号线站点)

上海地铁11号线站点线路图高清(上海地铁11号线站点)

早晨的太阳句子唯美短句(早晨的太阳)

早晨的太阳句子唯美短句(早晨的太阳)

国产鱼竿什么牌子质量好些(国产鱼竿什么牌子好)

国产鱼竿什么牌子质量好些(国产鱼竿什么牌子好)

账单日和还款日哪个划算(账单日和还款日有什么区别)

账单日和还款日哪个划算(账单日和还款日有什么区别)

撑杆跳高股票好不好(撑杆跳高)

撑杆跳高股票好不好(撑杆跳高)

砻糠怎么读(砻)

砻糠怎么读(砻)

如何查日柱(生辰八字日柱怎么算)

如何查日柱(生辰八字日柱怎么算)

金婚是结婚多少年纪念日啊(金婚是结婚多少年)

金婚是结婚多少年纪念日啊(金婚是结婚多少年)

魔兽世界数据库3.35(魔兽世界数据库)

魔兽世界数据库3.35(魔兽世界数据库)

图文推荐

加工贸易企业是指什么(加工贸易企业是什么意思)

加工贸易企业是指什么(加工贸易企业是什么意思)

入团志愿格式模板图(模板图)

入团志愿格式模板图(模板图)

旅行结婚怎么办婚礼(旅行结婚)

旅行结婚怎么办婚礼(旅行结婚)

近亲属包括哪些人民法典(近亲属包括哪些人)

近亲属包括哪些人民法典(近亲属包括哪些人)

什么是卡士酸奶(卡士酸奶为什么那么贵)

什么是卡士酸奶(卡士酸奶为什么那么贵)