精华内容
下载资源
问答
  • 看不懂一段代码地址是怎么来的,不知道这个地址怎么算出来。 [color=#FF0000]pISR = 0xE59FF3D8; 这个地址是怎么来的?[/color] void InitializeInterrupt(void) { sV210VIC0 = (VIC_REG *)OALPAtoVA...
  • 上期我们讲了台达VFD-M变频器的modbus ASCII报文格式,里面用到的校验为LRC校验,有朋友反馈说不会算LRC校验,今天我们就来学习LRC校验到底是个什么东西,是怎么算出来的。我们以让变频器正转的报文为例。通过H06...

    上期我们讲了台达VFD-M变频器的modbus ASCII报文格式,里面用到的校验为LRC校验,有朋友反馈说不会算LRC校验,今天我们就来学习LRC校验到底是个什么东西,是怎么算出来的。

    我们以让变频器正转的报文为例。通过H06命令把H0012写入到01号变频器的H2000地址。其中H0012为变频器的正转代码。

    244d6c36c2d5b4ca3aa404dba97db60b.png

    那么表格中这个C7是怎么计算出来的呢?

    首先我们要知道什么是LRC校验。LRC校验就是总和校验,把所有的数据内容加起来得到一个总和,再以256为单位,超出部分舍去,然后再计算二次反补后得到的结果即为LRC校验。听不懂没关系,我们只需要知道怎么算!

    先算总和H01+H06+H20+H00+H00+H12=H39,那么LRC=H100-H39=HC7。

    这里有个小技巧,我们可以利用电脑自带的计算器来算,记得要选择程序员模式哦。

    校验码算出来了,我们就可以把报文写出来了。因为这些都是ASCII码,所以数据都要转换成十六进制数来发送哦。

    所以最后的报文是

    3A 30 31 30 36 32 30 30 30 30 30 31 32 43 37 0D 0A

    下面是ASCII转换表。

    7d2684b78bec15ac10b9d135d408a6e1.png

    以上便是LRC校验的计算方法,想系统的学习PLC相关知识的朋友可以点个关注,欢迎评论交流,点赞转发。感谢大家的支持!@

    展开全文
  • 觉得你还是有点逼格的,巧用位运算,不仅会提升性能,还会让代码的可读性更好,达到四两拨千斤的效果,今天我们就来学学位运算在解题中的一些技巧,最后会用位运算来看看怎么解八皇后这道大 B...
    有道云笔记地址note.youdao.com

    位运算在生产或算法解题中并不常见,不过如果你用得好,可以达到事半功倍的效果,而且位运算用得好,也可以极大地提升性能,如果在生产或面试中能看到使用位运算来解题,会让人眼前一亮,觉得你还是有点逼格的,巧用位运算,不仅会提升性能,还会让代码的可读性更好,达到四两拨千斤的效果,今天我们就来学学位运算在解题中的一些技巧,最后会用位运算来看看怎么解八皇后这道大 Boss 题,相信你看完肯定会有收获!

    本文将会从以下几个方面来讲解位运算

    • 什么是位运算,位运算常见操作
    • 位运算使用技巧简介
    • 巧用位运算解算法题

    什么是位运算,位运算常见操作

    在现代计算机中所有的数据在内存中都是以二进制存在的,位运算就是直接对整数在内存中的二进制位进行操作,由于位运算直接对内存数据进行操作,无需转成十进制,因此使用位运算的处理速度是很快的。

    举个简单的例子, 当我们要计算 6 & 4 的结果,在做位运算的时候首先要把 6,4 转成二进制,然后再做相应的位操作(与)。

    307be76403d078b4da3f4783e6f6cd27.png

    基本的位运算有与、或、异或、取反、左移、右移这6种,介绍如下:

    & 与:只有当两位都是 1 时结果才是 1,否则为 0 。

    0110 & 0100 ----------- 0100

    | 或:两位中只要有 1 位为 1 结果就是 1,两位都为 0 则结果为 0。

    0110 & 0110 ----------- 0110

    ^ 异或:两个位相同则为 0,不同则为 1

    0110 ^ 0100 ----------- 0010

    ~ 取反:0 则变为 1,1 则变为 0

    ~ 0110 ----------- 1001

    << 左移:向左进行移位操作,高位丢弃,低位补 0

    int a = 8; a << 3; 移位前:00000000000000000000000000001000 移位后:00000000000000000000000001000000

    >> 右移:向右进行移位操作,对无符号数,高位补 0,对于有符号数,高位补符号位

    unsigned int a = 8; a >> 3; 移位前:00000000000000000000000000001000 移位后:00000000000000000000000000000001 int a = -8; a >> 3; 移位前:11111111111111111111111111111000 移位后:11111111111111111111111111111111

    位运算使用技巧简介

    接下来我们就由浅入深地来学习一下使用位运算的那些黑科技

    1、 判断整型的奇偶性

    使用位运算操作如下

    if((x & 1) == 0) { // 偶数 } else { // 奇数 }

    这个例子相信大家都见过,只需判断整型的第一位是否是 1 即可,如果是说明是奇数,否则是偶数

    2、 判断第 n 位是否设置为 1

    if (x & (1<<n)) { // 第 n 位设置为 1 }else { // 第 n 位设置为 1 }

    在上例中我们判断第一位是否为 1,所以如果要判断第 n 位是否 1,只要把 1 左移 n 位再作与运算不就完了。

    3、 将第 n 位设置为 1

    y = x | (1 << n)

    思路同第二步,先把 1 移到第 n 位再作或运算,这样第 n 位就肯定为 1。

    4、 将第 n 位设置为 0

    y = x & ~(1<<n)

    先将 1 左移到 第 n 位,再对其取反,此时第 n 位为 0,其他位都为 1,这样与 x 作与运算后,x 的第 n 位肯定为 0。

    5. 将第 n 位的值取反

    y = x ^ (1<<n)

    我们知道异或操作是两个数的每一位相同,结果为 0,否则是 1,所以现在把 1 左移到第 n 位,则如果 x 的第 n 位为 1,两数相同结果 0,如果 x 的第 n 位为 0,两数不相同,则为 1。来看个简单的例子

    01110101 ^ 00100000 -------- 01010101

    如图示,第五位刚好取反

    6、 将最右边的 1 设为 0

    y = x & (x-1)

    如果说上面的 5 点技巧有点无聊,那第 6 条技巧确实很有意思,也是在 leetcode 经常出现的考点,下文中大部分习题都会用到这个知识点,务必要谨记!掌握这个很重要,有啥用呢,比如我要统计 1 的位数有几个,只要写个如下循环即可,不断地将 x 最右边的 1 置为 0,最后当值为 0 时统计就结束了。

    count = 0 while(x) { x = x & (x - 1); count++; }

    先介绍这么多吧,如果大家对其他的位运算技巧感兴趣可以看看文末的参考链接

    巧用位运算解算法题

    接下来我们看看位运算在算法题中的应用。

    1、 高频面试题:老鼠试毒

    有 8 个一模一样的瓶子,其中有 7 瓶是普通的水,有一瓶是毒药。任何喝下毒药的生物都会在一星期之后死亡。现在,你只有 3 只小白鼠和一星期的时间,如何检验出哪个瓶子里有毒药?

    解题步骤如下:

    1、 把这 8 个瓶子从 0 到 7 进行编号,用二进制表示如下

    000 001 010 011 100 101 110 111

    2、 将 0 到 7 编号中第一位为 1 的所有瓶子(即 1,3,5,7)的水混在一起给老鼠 1 吃,第二位值为 1 的所有瓶子(即2,3,6,7)的水混在一起给老鼠 2 吃, 第三位值为 1 的所有瓶子(4,5,6,7)的水混在一起给老鼠 3 吃,现在假设老鼠 1,3 死了,那么有毒的瓶子编号中第 1,3 位肯定为 1,老鼠 2 没死,则有毒的瓶子编号中第 2 位肯定为 0,得到值 101 ,对应的编号是 5, 也就是第五瓶的水有毒。

    这道题及其相关的变种在面试中出现地比较频繁,比如我现在把 8 瓶水换成 1000 瓶,问你至少需要几只老鼠才能测出有毒的瓶子,有了上述的思路相信应该不难,几只老鼠就相当于几个进制位,显然 2^10 = 1024 > 1000,即 10 只老鼠即可测出来。

    2、 leetcode 232

    给定一个数,判断它是否是可以用 2 的幂次方表示,可以返回 true,不可以返回 false,比如 8 = 2^3, 说明可以用 2 的幂次方表示,返回 true,9 不可以,所以返回 false。

    解题分析:这题常规解法是做个循环不断地乘以 2 ,看下是否等于给定的值,如果等于说明是 2 的幂次方,否则如果不断累乘 2 后大于给定的值,说明不能用 2 的幂次方表示,时间复杂度是所做的累乘的次数,即 2^n >= 给定的值中的 n。

    那是否有更快的解法呢?

    上文的介绍中其实我们已经埋下伏笔了,没错用 x & (x-1),首先我们要发现能用 2 的幂次方表示的数的特点:它的所有位中有且仅有一位为 1,如

    00001 2^0 = 1 00010 2^1 = 2 00100 2^2 = 4 01000 2^3 = 8 10000 2^3 = 16

    如图示,所有 2 的幂次方最多只有一位为 1

    明白了这一点, 我们的思路就简单了,由于符合 2 的幂次方的数只有一位为 1,x & (x-1) 是把最后一位 1 置为 0,所以只要做一次 x & (x-1) 运算,看它的值是否等于 0 即可,如果是 0 说明它可以用 2 的幂次方表示,否则不可以,代码如下:

    if(x&(x-1)) { //使用与运算判断一个数是否是2的幂次方 printf("%d不是2的幂次方!n", num); } else { printf("%d是2的%d次方!n", num, log2(num)); }

    只用一行代码即可搞定,方便了很多!

    3、 leetcode 232

    给定一个非负整数 num. 对于 0 ≤ i ≤ num 范围中的每个数字 i, 计算其二进制数中 1 的数目并将它们作为数组返回。输入: 5 输出: [0,1,1,2,1,2]

    这题的常规解法相信大家都能猜到,就是从 0 到 num 循环一遍,求出每个数字 i 中 1 的数目。

    如果用位运算怎么做呢,先来看下解法,然后我们再来分析为啥这样写,非常巧妙!

    Python 代码

    vector<int> countBits(int num) { vector<int> bits(num+1, 0); for (int i = 1; i<= num; i++) { bits[i] += bits[i & (i-1)] + 1; } }

    Java 代码

    publicstaticint[] countBits(int num) { int[] bits = newint[num+1]; Arrays.fill(bits, 0); for (int i = 1; i <= num; i++) { bits[i] = bits[i & (i-1)] + 1; } return bits; }

    最关键的代码看这一行

    bits[i] += bits[i & (i-1)] + 1;

    这行代码是啥意思呢,i & (i-1) 是把 i 的最后一个值为 1 的位设为 0,不难发现整数「i & (i-1)」 中 1 的位数比 i 中 1 的位数少一个 ,所以要加 1(即 bits[i & (i-1)] + 1)。

    非常巧妙,这样从 1 开始走一遍循环即可,中间不要做任何针对变量 i 的 1 的个数的计算,只不过付出了一个 bits 数组的代价。这里也是利用了以空间换时间的思想。

    4、 利用位运算来解八皇后问题

    接下来我们来看看终级 Boss 题,如何用位运算来解八皇后问题,解题中运用到了非常多的位运算技巧,相信你学完会收获不少。

    在 8×8 格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法

    举个简单的下图所示的例子,如果在棋盘上放置一个皇后,则与这个皇后同一行,同一列,且皇后所在斜线经过的格子不能再放其他皇后。

    307be76403d078b4da3f4783e6f6cd27.png

    如图示,在其中任意一行放置一个皇后,则与此皇后同行,同列,同对角线的都不允许再放其他皇后,图中蓝色区块不允许放其他皇后。

    一般我们用回溯法解八皇后。这里简单介绍一下啥是回溯法。

    在第一行从左到右先选择一个位置放置皇后,由于第一行放了皇后,第二行可放皇后的位置受到了限制(下图蓝色区块表示对应行的格子不能放皇后)

    307be76403d078b4da3f4783e6f6cd27.png

    如图示,第二行放皇后的位置只能从第三个格子开始选

    第二行我们选第三个格子放皇后,选完开始在第三行选,第三方可选的位置也受到了第一,二行皇后所放位置的影响

    307be76403d078b4da3f4783e6f6cd27.png

    如图示,第三行只能从第五个格子开始放置皇后

    同理,第三,四,五行都从左到右选择符合条件的的格子放置皇后,选完后问题来了,第六行所在行没有可选的位置了!如图示

    怎么办呢,回溯!重新摆放第五行的皇后,将其放到第八格上

    重新摆放后发现第六行还是没有符合条件的格子,咋办,我们知道第六行可摆放皇后的格子受第五行影响,而第五行受第四行摆放皇后位置的影响的,所以回溯到第四行,将皇后位置摆放到当前行的其他位置(第七格),再接着往下放 5,6,7,8 行的皇后。。。,只要不满足条件,改变上一层的的条件重新来,上一层调整后还是不符合条件,再调整上上层的。。。,调整完后重新往下递归选择,直到找到符合条件的,找到之后再在第一层换一个位置选皇后递归往下层选择执行,直到找到所有的解,这种不满足条件就回退上层调整再试的思想就是回溯法,可以看到回溯法一般是用递归实现的。

    回溯算法有不少变种,这里我们重点介绍使用位运算的回溯算法,它是所有解法中最高效的!如果在面试中能使用位运算来解回溯算法,绝对会让面试官给你个大大的赞!

    接下来是重点了,怎么用位运算来求解。

    在以上回溯法的分析中,我们不难发现,在八皇后问题中,问题的关键是找出行可放皇后的格子。找到之后问题就解决了 90%,所以接下来我们就来看看怎么找这些可用的格子。

    假设我们要求解第三行可放皇后的格子(说明一二行的皇后已放好了)那么第三行可放皇后的位置受到哪些条件的限制呢。显然在第一二行已放皇后的格子所在的列,左斜线,右斜线对应的方格都不能放皇后,如图示:

    307be76403d078b4da3f4783e6f6cd27.png

    我们以 column 来记录所有上方行已放置的皇后导致当前行格子不可用的集合,所在列如果放了皇后,则当前行格子对应的位置为 1,否则为 0,同理,以 pie(撇,左斜线) 记录所有已放置的皇后左斜方向导致当前行格子不可用的集合, na(捺,右斜线) 表示所有已放置的皇后右斜方向导致当前行不可用的集合。则对于第三行来说我们有:

    column = 10010000 (上图中的第一个图,第 1,4 列放了皇后,所以 1,4 位置为 1,其他位置为 0) pie = 00100000 (上图中的第二个图,左斜线经过第三行的第三个方格,所以第三位为 1) na = 00101000 (上图中的第三个图,右斜线经过第三行的第三, 五个方格,所以第三,五位为 1)

    将这三个变量作或运算得到结果如下

    10010000 | 00100000 | 00101000 ----------------------- 10111000

    也就是说对于第三层来说第 1,3,4,5 个格子不能放皇后。如图示

    307be76403d078b4da3f4783e6f6cd27.png

    于是可知 column | pie | na 得到的结果中值为 0 的代表当前行对应的格子可放皇后, 1 代表不能放,但我们想改成 1 代表格子可放皇后, 0 代表不可放皇后,毕竟这样更符合我们的思维方式,怎么办,取反不就行了,于是我们有~(column| pie | na)。

    问题来了,这样取反是有问题的,因为这三个变量都是定义的 int 型,为 32 位,取反之后高位的 0 全部变成了 1,而我们只想保留低 8 位(因为是 8 皇后),想把高位都置为 0,怎么办,这里就要用到位运算的黑科技了

    ~(column | pie | na) & ((1 << 8)-1)

    后面的的 ((1<< 8) -1) 表示先把 1 往左移 8 位,值为 100000000,再减 1 ,则低 8 位全部为 1,高位全部为 0!(即 0011111111)再作与运算,即可保留低 8 位,去除高位。

    费了这么大的劲,我们终于把当前行可放皇后的格子都找出来了(所有位值为 1 的格子可放置皇后)。接下来我们只要做个循环,遍历所有位为 1 的格子,每次取出可用格子放上皇后,再找下一层可放置皇后的格子,依此递归下去即可,直到所有行都遍历完毕(递归的终止条件)。

    还有一个问题,已知当前行的 column,pie,na,怎么确定下一行的 column,pie,na 的值(毕竟选完当前行的皇后后,要确定下一行的可用格子,而下一行的可用格子依赖于 column,pie,na 的值)

    上文可知,我们已经选出了当前行可用的格子(相应位为 1 对应的格子可用),假设我们在当前行选择了其中一个格子来放置皇后,此位置记为 p(如果是当前行的最后一个格子最后一个格子,则值为 1,如果放在倒数第二个,值为 10,倒数第三个则为 100,依此类推),则对于下一行来说,显然 column = column | p

    那么 pie 呢,仔细看下图,显然应该为 (pie | p) << 1, 左斜线往下一行的格子延展时,相当于左移一位,

    307be76403d078b4da3f4783e6f6cd27.png

    如图示:下一行的 pie 显然为 (pie | p) << 1。

    同理 下一行的 na 为 (na | p) >> 1。

    有了以上详细地解析,我们就可以写出伪代码了

    void queenSettle(row, colomn,pie,na) { N = 8; // 8皇后 if (row >= N) { // 遍历到最后一行说明已经找到符合的条件 count++; return } // 取出当前行可放置皇后的格子 bits = (~(colomn|pie|na)) & ((1 << N)-1) while(bits > 0) { // 每次从当前行可用的格子中取出最右边位为 1 的格子放置皇后 p = bits & -bits // 紧接着在下一行继续放皇后 queenSettle(row+1, colomn | p, (pie|p) << 1, (na | p) >> 1) // 当前行最右边格子已经选完了,将其置成 0,代表这个格子已遍历过 bits = bits & (bits-1) } }

    一开始传入 queenSettle(0,0,0,0) 这样即可得到最终的解。伪代码写得很清楚了

    展开全文
  • 代码:这段代码是内存linux0.11中学来的,语义大概是从后面搜索每字节,如果找到1就把它改成2,然后返回改动处前一个字节的地址。(可以看到显示字符串的起始地址是0x404004,后面显示的地址为404009,因为是从后往...

     这是运行效果:

    百度网盘下载地址:

    https://pan.baidu.com/s/1_-IznMWL3z1CROziiD6mCw

    代码:这段代码是内存linux0.11中学来的,语义大概是从后面搜索每字节,如果找到1就把它改成2,然后返回改动处前一个字节的地址。(可以看到显示字符串的起始地址是0x404004,后面显示的地址为404009,因为是从后往前检索)

    #include <stdio.h>
    
    #define edi_val(edi) ({ \
    register unsigned int __res; \
    __asm__ __volatile__("std; repne; scasb; \
    	movb $2, 1(%%edi); \
    	cld" \
    	:"=D"(__res) \
    	:"0"(edi),"a"(1)); \
    __res; \
    })
    
    int main(void) {
    	static char str[10] = {1,1,1,1,1,1,1,3,3,3}; //这里的static等价于汇编中的db .byte
    	for(int i = 9; i >= 0; i--)
    		printf("%d\t", str[i]);
    	printf("\n0x%x\n", str);
    	printf("0x%x\n", edi_val(str + 10 - 1));
    	for(int i = 9; i >= 0; i--)
    		printf("%d\t", str[i]);
    
    }
    

     

    展开全文
  • 内存对齐:成员存放的地址能整除它本身的大小 1.前面所有成员大小相加是当前成员大小的倍数 2.结构体的大小能整除当个最大类型的大小这里是在这里插入代码片引用 #include <stdio.h> //#pragma pack(1)//改变...

    结构体的大小 //笔试重点
    内存对齐:成员存放的地址能整除它本身的大小
    1.前面所有成员大小相加是当前成员大小的倍数
    2.结构体的大小能整除当个最大类型的大小

    #include <stdio.h>
    
    //#pragma pack(1)//改变内存对齐的方式
    struct A//空结构体,在c++1字节,在C非法
    {
    };
    
    struct B
    {
    	char a;//1+3
    	char arr[3];//不使用,占位
    	int b;//4
    };//8
    
    struct C
    {
    	char a;//1+1
    	short b;//2
    	int c;//4
    };//8
    
    struct D
    {
    	char a;//1+3
    	int b;//4
    	float c;//4+4
    	double d;//8
    };//24 
    
    struct E
    {
    	char a;//1+3
    	int b;//4
    	short c;//2
    };//10+2=12
    
    struct F
    {
    	int a;//4
    	char b;//1
    };//5+3=8
    
    struct G
    {
    	char a;//1
    	struct GG
    	{
    		int b;//4
    		float c;//4
    	}d;//8
    };//1+8+3=12
    
    int main()
    {
    	printf("%d\n",sizeof(struct G));
        printf("%d\n",sizeof(struct E));
        
    	return 0;
    }
    
    展开全文
  • 在《linux内核全注释V3.0》P22中,有这么一段话: ...CS段寄存器,段基地址寄存器,IP寄存器,这三个值是怎么算得出最终指向0XFFFF FFF0处的。还是说文中的CS寄存器,基地址,IP寄存器中的某个值有错?
  • 今天推荐几个模型力和参数统计的工具,两行代码确定模型到底有多少参数,每秒的浮点运算(FLOPs)有多少。对于 PyTorch 模型来说,参数量和每秒浮点运算数(FLOPs)可以通过开源工具 PyTorch-OpCounter 获取。开源项目...
  • 无奈之下,只好硬肯汇编了,所以多数代码在boot.s中用汇编实现的,至于c中的一堆代码当然是从别人的文章中摘抄的(呵呵这也原创),图中是敲击键盘后显示的代码,后面多余的字符,也不知是怎么回事,今天太晚了,...
  • 雨一直下,气氛还融洽……,我这边下了一周的雨了,趁着目前有个把小时的间歇...我们可以看到他是通过JS渲染后加载了一个iframe框架,如果我们直接查看源代码的话是没有这个内容的,那怎么获取这个链接地址呢,我们..
  • 表是怎么得到的呢?当然是计算出来的,下面的程序给出了多项式是0x11021的计算程序。 复制代码 代码如下: ## 第三段代码 void main( void ) { unsigned int crc = 0; unsigned char i; unsigned int j; for(j = ...
  • 不知道是因为最近kaihui还是怎么的,打开android sdk官方网站特别的慢,想下载最新版本的platform几乎变成不可能完成的任务,不知道为什么Google不像Apache那样在各国设立镜像站。为了预防今后再出现这样的情况,...
  • 目录前言算法研究核心代码最终效果小插叙体验地址项目地址特别感谢 前言 昨天在群里看到了一个分享的小游戏《王者24点》 然后开心地分享了自己340秒10个的战绩 结果被小青瞬间KO。。她用202秒就结束了 ...
  • 怎么算持久怎么算短暂呢?取决于我的代码里有没有一个变量来保存他。举个例子: int i = 5; string s1(“ppap”); 都可以完成取地址的操作的操作 &i,&si; 那么定义一个左值引用,就是给这些地址起一个其他的...
  • 上一次我们已经实现了如何直接操作寄存器地址来点亮一盏LED灯,但是这样实在是太麻烦,那么这次要讲的就是,如何实现寄存器映射,更加快捷的实现点灯(怎么又是点灯??)我们先来看一下上一次的代码。图中的这些地址...
  • 009/160 CrackMe Andrénalin #2

    千次阅读 2020-01-23 12:57:47
    Crack 先随便输入点什么试试 ...下面再来看看这个注册码是怎么算出来的 直接用 VB 反编译器基本上代码都出来了,也就没啥难度了 这个东西好像不支持加注释,那我就把代码粘出来吧。 Private Sub Command1_Click() ...
  • 虚函数探秘

    2019-09-30 20:07:48
    那么静态和动态,怎么算静,怎么算动呢?静态多指编译期能决定的事情,而动态多指运行时才决定的事情。例如重载,在编译期生成符号的时候就已经确定不同的函数了,而继承的重写(override)则是在运行到具体的代码...
  • 汇编语言--寄存器间接寻址

    万次阅读 2016-11-01 01:38:20
    在汇编语言中 , 我们主要涉及... 在认识以及应用这些寻址方式之前 , 我们首要应当了解一个数据在寄存器当中的物理地址怎么算的 .   物理地址由段址和段内的偏移量决定的 , 这个段址有代码段寄存器(CS) , 数据段寄
  • Github地址 https://github.com/wean2016/wc 遇到的困难及解决方法 困难描述 : 没做过这种命令行带参数的程序,不知道怎么处理参数 ...【注意】不得贴项目无关代码,一经发现,抄袭。 private st...
  • tank-1.0.0.tar.gz

    2020-06-11 09:29:09
    使用java实现的坦克大战,还是学生,代码可能不太好看,该有的注释基本都有,目前还没有实现网络对战,有点懒,还有很多东西需要去学习,敌人ai懒得写,也不知道怎么写才比较好,所以随便写了一下,github地址:...
  • 爱淘之家 v2.0.rar

    2019-07-07 21:15:16
    为了这个东西,,我倒是整了挺长时间,,思前想后,,还是了,,喜欢的就拿去用。...初学者也可以看看怎么写的,,,当自己敲代码的一点贡献。 后台地址:http://www.xxxxx.com/admin 解压密码:www.baidutbw.com
  • 几种卡通渲染方法的解析

    千次阅读 2016-08-24 20:02:47
    代码全部出自RenderMonkey的样例文件NPR.rfx,下载地址: ...龙书上讲的卡通渲染的方法一直没有看懂,两个faceNormal一直不明白是怎么算出来的 =_=||| ,看了其他DX sample,只看到有计算切法线之类的,
  • container of()函数简介

    2020-09-01 22:17:45
    怎么还有0呢??? 哎,了,还是放弃吧。。。)。 这就是内核大佬们厉害的地方,随便两行代码就让我们怀疑人生,凡是都需要一个过程,慢慢来吧 其实,原理很简单: 已知结构体type的成员member的地址ptr,求解...
  • 在结构体和类中,有很多问题都是求sizeof问题,这个问题不是简单的出各个类型的长度然后相加就行了,而是要考虑编译器是如何编译这些代码的,是如何为结构体和类中的变量怎么分配内存空间的。...
  • container_of

    2020-08-21 10:59:37
    在linux 内核编程中,会经常见到一个宏函数container_of(ptr,type,member), 但是当你通过追踪源码时,像我们这样的一般... 其实,原理很简单: 已知结构体type的成员member的地址ptr,求解结构体type的起始地址。 ...
  • 设计模式-入门

    2020-10-14 12:44:34
    怎么搞懂一个设计模式? 这个设计模式的意图是什么,它要解决一个什么问题,什么时候可以使用它;它是如何解决的,掌握它的结构图,记住它的关键代码;能够想到至少两个它的应用实例,一个生活中的,一个软件中...
  • 地址:点击打开链接这个题目,怎么说呢,一开始我看到这个题目,想到的时,把高度替换一下,然后找最短路,记录下路径,随后再去找真的最短路。后来发现不太可行,因为可能不止一个。而且也不太好判断。于是网上找了...
  • 再来一个msn机器人

    2007-12-13 15:50:07
    找了半天库,总算从一个角度里找到一个日本公司开发的库不错,msnm.rb 地址在这里: [url]http://zerobase.jp/blog/entry-213.html[/url] 日文的,不过我猜了一下,下载了代码,是GPL协议的。附件里也可以...
  • PSCAD处理次同步振荡

    2020-08-02 20:05:18
    楼主在学习的时候,不知道怎么处理次同步振荡例,无法运行,希望有经验的旁友可以指点一下。 PSCAD软件处理次同步振荡问题 2020-08-02 18-58-51 计算运行存在bug,求问pscad大神们,是什么原因,谢谢! 有...
  • 该CPU采用8位地址总线,每个进程拥有128K地址空间,其中包括32个2K的数据页和32个2K的代码页,这些地址影射到22位的物理地址空间中,如果上外部设备的地址空间就是23位物理地址空间。 怎么样?够强的吧?这还...

空空如也

空空如也

1 2 3 4
收藏数 78
精华内容 31
关键字:

地址代码怎么算