CSAPP的Lab学习——DataLab

news2024/11/29 6:37:45

文章目录

  • 前言
  • 一、bitXor(异或)
  • 二、tmin(最小的二进制补码)
  • 三、isTmax(判断是否为最大值)
  • 四、allOddBits(判断奇数位是否都是1)
  • 五、negate(计算相反数)
  • 六、isAsciiDigit(判断0x30 <= x <= 0x39)
  • 七、conditional(实现x ? y : z)
  • 八、isLessOrEqual(比较两个数的大小)
  • 九、logicalNeg(逻辑取反)
  • 十、howManyBits(计算位数)
  • 十一、floatScale2(将单精度浮点数乘以 2)
  • 十二、floatFloat2Int(将单精度浮点数转为整数)
  • 十三、floatPower2(计算2.0ˆx)
  • 总结


前言

一个本硕双非的小菜鸡,备战24年秋招。刚刚看完CSAPP,真是一本神书啊!遂尝试将它的Lab实现,并记录期间心酸历程。

官方网站:CSAPP官方网站

以下是官方文档翻译:
此分配的目的是为了更熟悉整数和浮点数的位级表示。你可以通过解决一系列的编程“谜题”来做到这一点。这些谜题中有很多都是人为的,但你会发现自己在思考一些细节。
bits.c文件包含了13个编程谜题中的每一个的骨架。你的任务是只使用整数谜题(即没有循环或条件)和有限数量的C运算和逻辑运算符来完成每个函数骨架。具体来说,您只允许使用以下八个运算符:
! ˜ & ˆ | + << >>
其中一些函数进一步限制了这个列表。此外,您不允许使用任何超过8位的常量。有关详细的规则和关于所需的编码风格的讨论,请参见bits.c中的注释。
本节描述您将以位解决的谜题。
表1列出了从最简单到最难的按难度顺序排列的谜题。“评级”字段给出了谜题的难度评级(点数),而“最大ops”字段给出了您允许用于实现每个函数的最大操作符数。有关函数所需行为的更多细节,请参见bits.c中的注释。您也可以参考test.c中的测试功能。这些功能被用作引用函数来表示函数的正确行为,尽管它们不满足函数的编码规则。
对于浮点难题,您将实现一些常见的单精度浮点运算。对于这些谜题,您被允许使用标准控制结构(条件、循环),并且您可以同时使用int和无符号数据类型,包括任意无符号和整数常量。您不能使用任何联合、结构或数组。最重要的是,您可能不使用任何浮点数据类型、操作或常量。相反,任何浮点操作数都将作为具有类型的形式传递给函数无符号,任何返回的浮点值都将为无符号类型。代码应该执行实现指定浮点操作的位操作。
每个"Expr"是一个表达式,只使用以下内容:

  1. 整数常量0到255 (OxFF),包括不允许使用像oxffffffff这样的大常量。
  2. 函数参数和局部变量(没有全局变量)。
    3.一元整数运算!~
  3. 二进制整数运算& ^ / + << >>
    有些问题甚至进一步限制了允许的操作符集合。每个“Expr”可以由多个操作符组成。

您不局限于每行一个操作符。明确禁止您:

  1. 使用任何控制结构,如if、do、while、for、switch等。
  2. 定义或使用任意宏。
    3.在此文件中定义任何附加函数。
  3. 调用任意函数。
  4. 可使用“&&”、“11”、“-”、“?”等其他操作:
  5. 使用任何形式的铸造。
  6. 使用除int以外的任何数据类型。
    这意味着不能使用数组、结构体或联合。

您可以假设您的机器:

  1. 使用2s补码,32位整数表示。
  2. 按算术方式执行右移。
    3.如果移位量小于0或大于31,则在移位时具有不可预测的行为。

浮点编码规则
对于需要实现浮点运算的问题,
编码规则没有那么严格。你可以使用循环和
有条件的控制。你可以同时使用整型和无符号。
可以使用任意整数和无符号常数。你可以用任何算术,
对int或unsigned数据的逻辑操作或比较操作。

你被明确禁止:

  1. 定义或使用任何宏。
  2. 在此文件中定义任何其他函数。
    3.调用任意函数。
  3. 使用任何形式的铸造。
  4. 使用除int或unsigned之外的任何数据类型。这意味着你
    不能使用数组、结构或联合。
  5. 使用任何浮点数据类型、操作或常量。

注:

  1. 使用dlc(数据实验室检查器)编译器(在讲义中描述)检查你的解决方案的合法性。
  2. 每个函数都有一个最大的操作数(整数、逻辑、或者比较),你可以在你的实现中使用函数的。最大运算符计数由dlc检查。注意,赋值(‘=’)不计算;你可以用尽可能多的这些都是你想要的,没有惩罚。
    3.使用最好的测试工具来检查函数的正确性。
  3. 使用BDD检查器来正式验证您的函数
  4. 函数中给出了每个函数的最大操作数
    每个函数的头注释。如果有任何不一致在写入操作和此文件中的最大操作之间,考虑这个文件是权威的来源。

我注:瞅代码介绍就行,要会编译。
在这里插入图片描述


一、bitXor(异或)

/ *

  • bitXor—x^y,只使用~和&
    *示例:bitXor(4,5) = 1
    *合法操作:~ &
    *最大ops: 14
    *评分:1
  • /
    第一眼瞅到这道题我愣了两秒,在我心中CSAPP不得极为高大上且难度巨高。。。然而虽然是第一题,但是我认为也没啥难度(插旗中等到时候回来被打脸)。然后就没过去,其实主要是文档的锅,我看了个||瞅差了。回头发现是异或。
    异或就是异为1同为0,这道题要是想出现比较结果只能依靠&。
    首先第一想法就是依靠&把相同排出去,写了个 ~(x & y),这个意思是不是同1为1,然后我就想到了 ~( ~x & ~y) ,这是不是同0为1,他俩的&就是答案,这就解决啦!
//1
/* 
 * bitXor - x^y using only ~ and & 
 *   Example: bitXor(4, 5) = 1
 *   Legal ops: ~ &
 *   Max ops: 14
 *   Rating: 1
 */
int bitXor(int x, int y) {
  return ~(~x & ~y) & ~(x & y);
}

Score Rating Errors Function
1 1 0 bitXor
Total points: 1/1

二、tmin(最小的二进制补码)

/ *

  • tmin—返回最小2的补数整数
    *法律操作:!n .;在比;
    *最大ops: 4
    *评分:1
  • /
    又是翻译的锅,第一眼没看懂题啥意思,后来看解释明白了(所以英语一定要学好啊)。
    当时看CSAPP的时候就研究过,当码长为8时,0的补码为0000 0000,则0-1也就是-1的补码就是1111 1111,所以最小为-128即1000 0000。至于为啥不再减一,因为再减一0111 1111就转正为127了。类比此题就是把1左移31位(因为该代码运行在32位系统上)
/* 
 * tmin - return minimum two's complement integer 
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 4
 *   Rating: 1
 */
int tmin(void) {

  return 1 << 31;

}

Score Rating Errors Function
1 1 0 tmin
Total points: 1/1

三、isTmax(判断是否为最大值)

/ *

  • isTmax——如果x是最大值,则返回1,如果是2,则返回2。
    *,否则为0
    *法律操作:!n .
    *最大ops: 10
    *评分:1
  • /
    对我来说真的是一道很精彩的题目,想了一个小时才勉强搞定。主要是!与~的区别吧,还有0x80000000这个不好区分。总之真是一道很棒的题目啊!
    思路最开始是想和0x7fffffff比较来着(犯了if语句用得太多的毛病),然后发现不对后改用+1判断,发现0x80000000这个相反数是跟本身一致的,然后又想到了第一题(当时还直接拷贝过来了,结果发现其实可以直接用^了)。然后就是经典的双数问题,改了又改还参考了一下其他人写的才弄好。
//2
/*
 * isTmax - returns 1 if x is the maximum, two's complement number,
 *     and 0 otherwise 
 *   Legal ops: ! ~ & ^ | +
 *   Max ops: 10
 *   Rating: 1
 */
int isTmax(int x) {
  return !!(~x) & !((~x) ^ (x + 1));
}

Score Rating Errors Function
1 1 0 bitXor
Total points: 1/1

四、allOddBits(判断奇数位是否都是1)

/ *

  • allOddBits -如果单词中所有奇数位都为1,则返回1
    *位从0(最低有效)到31(最高有效)
    allOddBits(0xFFFFFFFD) = 0, allOddBits(0xAAAAAAAA) = 1
    *法律行动:!n; n;在比;
    *最大ops: 12
    *评分:2分
  • /
    有了上一道题的经验就知道这类题该怎么做了(但其实后来发现是两个类型的),上来先找规律做比较,然后“惊讶”的发现lab是可以用=的,只是不能超限。。。
    想办法凑异或呗,既然可以这么搞那就拿0xAA做比较,先想办法弄出一个0xAAAAAAAA来,移位操作再加到一起,然后一个逻辑取反。。。
    一顿操作猛如虎,一看没过。奥,二百五竟是我自己,偶数位不用考虑忘了,那就先控下数再比较。
/* 
 * allOddBits - return 1 if all odd-numbered bits in word set to 1
 *   where bits are numbered from 0 (least significant) to 31 (most significant)
 *   Examples allOddBits(0xFFFFFFFD) = 0, allOddBits(0xAAAAAAAA) = 1
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 12
 *   Rating: 2
 */
int allOddBits(int x) {
	int m1 = 0xAA;
	int m2 = m1 + (m1 << 8);
	int m3 = m2 + (m2 << 16);
  return !(m3 ^ (x & m3));
}

Score Rating Errors Function
2 2 0 allOddBits
Total points: 2/2

五、negate(计算相反数)

/ *
*负-返回-x
*示例:negate(1) = -1。
*法律行动:!n; n;在比;
*最大操作数:5
*评分:2分

  • /
    送分题,送分题!当时我在第三题有多狼狈,逻辑取反和按位取反整的糊涂,现在我就有多嚣张(不是)。按位取反可以通俗理解为*(-1)再-1,所以这题就是先按位取反再+1。
/* 
 * negate - return -x 
 *   Example: negate(1) = -1.
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 5
 *   Rating: 2
 */
int negate(int x) {
  return ~x + 1;
}

Score Rating Errors Function
2 2 0 negate
Total points: 2/2

六、isAsciiDigit(判断0x30 <= x <= 0x39)

/ / 3
/ *

  • isAsciiDigit—如果0x30 <= x <= 0x39(字符’0’到’9’的ASCII编码),则返回1
    *示例:isAsciiDigit(0x35) = 1。
  • isAsciiDigit(0x3a) = 0。
  • isAsciiDigit(0x05) = 0。
    *法律操作:!n .;在比;
    *最大ops: 15
    *评分:3
  • /
    思路好想,结果我写错了,忘了异或是按位操作的,忘加!转数字了,试了很多次才发现问题出在什么地方。
//3
/* 
 * isAsciiDigit - return 1 if 0x30 <= x <= 0x39 (ASCII codes for characters '0' to '9')
 *   Example: isAsciiDigit(0x35) = 1.
 *            isAsciiDigit(0x3a) = 0.
 *            isAsciiDigit(0x05) = 0.
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 15
 *   Rating: 3
 */
int isAsciiDigit(int x) {
  return (!((x & 8) ^ 0) + !((x & 14) ^ 8)) & !((x >> 4) ^ 3);
}

Score Rating Errors Function
3 3 0 isAsciiDigit
Total points: 3/3

七、conditional(实现x ? y : z)

/ *
*有条件的——与x相同?Y: z
*示例:条件(2,4,5)= 4
*法律操作:!n .;在比;
*最大ops: 16
*评分:3

  • /
    这题做出来没费劲,解释费老大力了,因为我最后时候居然解释不通我的代码了。
    大概路子是利用0111和0000的性质了。
    主要我面临的问题是反补码和~的不清楚,这次通过这道题应该没问题了,熟悉了很多。这道题对我影响意义很大!
    记住1的补码是-1,-1的补码是1111,0的补码还是0。
    ~0 = 1111
/* 
 * conditional - same as x ? y : z 
 *   Example: conditional(2,4,5) = 4
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 16
 *   Rating: 3
 */
int conditional(int x, int y, int z) {
	int res = ~(!(x ^ 0)) + 1;
  return (~res & y) | (res & z);
}

Score Rating Errors Function
3 3 0 conditional
Total points: 3/3

八、isLessOrEqual(比较两个数的大小)

/ *

  • isLessOrEqual—如果x <= y,则返回1,否则返回0
    *示例:isLessOrEqual(4,5) = 1。
    *法律操作:!n .;在比;
    *最大ops: 24
    *评分:3
  • /
    心态爆炸的一道题,其实思路还是挺清晰的,但就是位操作与或非啥的太乱了,给我整的心态爆炸,费了三张演算纸,一个下午的时间才勉强解决。。。
    通俗易懂的分类讨论,同号异号,正负号以及值相同的情况。我主要面对的问题是写着写着就乱了不知道是0是1(当时脑子也乱就觉得马上就能解决了),后来休息的时候发现这样不行,拿演算纸好好推导了一下思路,这才使得难度变简单了些。结果千辛万苦发现没有考虑值相等的情况,又是一顿捅咕。
    说多了都是泪啊,切记!
/* 
 * isLessOrEqual - if x <= y  then return 1, else return 0 
 *   Example: isLessOrEqual(4,5) = 1.
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 24
 *   Rating: 3
 */
int isLessOrEqual(int x, int y) {
	int flagX = (x >> 31) & 1;
	int flagY = (y >> 31) & 1;
	int z = y + (~x + 1);
	int flagZ = !((z >> 31) & 1) | !(z ^ 0);
  return (!(~flagX & flagY)) & ((flagX & ~flagY) | (flagZ));
}

Score Rating Errors Function
3 3 0 isLessOrEqual
Total points: 3/3

九、logicalNeg(逻辑取反)

/ / 4
/ *

  • logicalNeg—实现!操作符,使用all of
    *合法的操作符except !
    *示例:logicalNeg(3) = 0, logicalNeg(0) = 1
    *合法操作:~ & ^ | + <<在比;
    *最大ops: 12
    *评分:4
  • /
    柳暗花明又一村。这题好歹回了点信心,太惨了。
//4
/* 
 * logicalNeg - implement the ! operator, using all of 
 *              the legal operators except !
 *   Examples: logicalNeg(3) = 0, logicalNeg(0) = 1
 *   Legal ops: ~ & ^ | + << >>
 *   Max ops: 12
 *   Rating: 4 
 */
int logicalNeg(int x) {
  return ((x | (~x + 1)) >> 31) + 1;
}

Score Rating Errors Function
4 4 0 logicalNeg
Total points: 4/4

十、howManyBits(计算位数)

/* howManyBits:返回表示x所需的最小位数
*二进制补码
*例子:howManyBits(12) = 5
*多少位(298)= 10
*多少位(-5)= 4
*多少位(0)= 1
*多少位(-1)= 1

  • howManyBits(0x80000000) = 32
    *法律操作:!n .;在比;
    *最大ops: 90
    *评分:4
  • /
    思路不难,可惜当时没有坚持到最后,还是参考了别人的代码。
    考虑正负,再每一位查找1。
/* howManyBits - return the minimum number of bits required to represent x in
 *             two's complement
 *  Examples: howManyBits(12) = 5
 *            howManyBits(298) = 10
 *            howManyBits(-5) = 4
 *            howManyBits(0)  = 1
 *            howManyBits(-1) = 1
 *            howManyBits(0x80000000) = 32
 *  Legal ops: ! ~ & ^ | + << >>
 *  Max ops: 90
 *  Rating: 4
 */
int howManyBits(int x) {
	int sign = x >> 31;
	x = (sign & ~x) | (~sign & x);
	int High_16 = (!(!(x >> 16))) << 4;
	x = x >> High_16;
	int High_8 = (!(!(x >> 8))) << 3;
	x = x >> High_8;
	int High_4 = (!(!(x >> 4))) << 2;
	x = x >> High_4;
	int High_2 = (!(!(x >> 2))) << 1;
	x = x >> High_2;
	int High_1 = (!(!(x >> 1)));
	x = x >> High_1;
	int High_0 = x;
	return High_16 + High_8 + High_4 + High_2 + High_1 + High_0 + 1;
}

Score Rating Errors Function
4 4 0 howManyBits
Total points: 4/4

十一、floatScale2(将单精度浮点数乘以 2)

/ /浮动
/ *

  • floatScale2——返回与表达式2*f for等价的位级别
    *浮点参数f。
    *参数和结果都以unsigned int类型传递,但是
    *它们被解释为的位级表示
    *单精度浮点值。
    *当argument是NaN时,返回argument
    *合法操作符:任何整数/无符号操作符,包括。||,&&。还有if, while
    *最大ops: 30
    *评分:4
  • /
    注意:浮点数解除了很多限制,比如可以使用if,while等函数了。
    主要是考察浮点数的定义:浮点数表示由符号位,尾数位和阶码位,又有单精度和双精度之分。根据阶码位分为规格化数、非规格化数和特殊值。都要分别考虑。
//float
/* 
 * floatScale2 - Return bit-level equivalent of expression 2*f for
 *   floating point argument f.
 *   Both the argument and result are passed as unsigned int's, but
 *   they are to be interpreted as the bit-level representation of
 *   single-precision floating point values.
 *   When argument is NaN, return argument
 *   Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while
 *   Max ops: 30
 *   Rating: 4
 */
unsigned floatScale2(unsigned uf) {
	unsigned s = uf & (1 << 31);
	unsigned exp = (uf & 0x7f800000) >> 23;
	unsigned frac = uf & (~0xff800000);

	if (exp == 0) return frac << 1 | s;
	if (exp == 255) return uf;
	exp++;
	if (exp == 255) return 0x7f800000 | s;
	
  return s | (exp << 23) | frac;
}

Score Rating Errors Function
4 4 0 floatScale2
Total points: 4/4

十二、floatFloat2Int(将单精度浮点数转为整数)

/ /浮动
/ *

  • floatScale2——返回与表达式2*f for等价的位级别
    *浮点参数f。
    *参数和结果都以unsigned int类型传递,但是
    *它们被解释为的位级表示
    *单精度浮点值。
    *当argument是NaN时,返回argument
    *合法操作符:任何整数/无符号操作符,包括。||,&&。还有if, while
    *最大ops: 30
    *评分:4
  • /
    分情况讨论的一题,根据阶码的值可分为>31(溢出),<0(非规格化数且接近0),>23(是一个没有小数点的23位数)以及>0的数,每一种都有各自的判断及结果标准。
    ps:半天没通过,搞得我以为哪里判断错了,回头一瞅发现127打成172了。。。
/* 
 * floatFloat2Int - Return bit-level equivalent of expression (int) f
 *   for floating point argument f.
 *   Argument is passed as unsigned int, but
 *   it is to be interpreted as the bit-level representation of a
 *   single-precision floating point value.
 *   Anything out of range (including NaN and infinity) should return
 *   0x80000000u.
 *   Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while
 *   Max ops: 30
 *   Rating: 4
 */
int floatFloat2Int(unsigned uf) {
	unsigned s = uf & (1 << 31);
	unsigned exp = (uf & 0x7f800000) >> 23;
	unsigned frac = (uf & 0x7fffff) | 0x800000;

	int E = exp - 127;
	
	if (exp == 255 || E > 31 || frac >> 31) return 0x80000000;

	if (E < 0) return 0;

	if (E > 23) frac <<= (E - 23);
	else frac >>= (23 - E);

    	if (!((uf >> 31) ^ (frac >> 31))) return frac;

	return ~frac + 1;
}

Score Rating Errors Function
4 4 0 floatFloat2Int
Total points: 4/4

十三、floatPower2(计算2.0ˆx)

/ *

  • floatPower2—返回与表达式2.0^x等价的位级别
    *(2.0的x次方)表示任意32位整数x。

*返回的unsigned值应该具有相同的位
*表示为单精度浮点数2.0^x。
*如果结果太小,无法用denorm表示,则返回

  • 0。如果太大,返回+INF。

*合法操作符:任何整数/无符号操作符,包括。||,&&。还有if, while
*最大ops: 30
*评分:4

  • /
    这个相对来说真的简单,可能是老师最后的仁慈了(笑)。记住阶码的值的概念,然后讨论一下太大溢出和太小无法表示的情况就ok啦!
/* 
 * floatPower2 - Return bit-level equivalent of the expression 2.0^x
 *   (2.0 raised to the power x) for any 32-bit integer x.
 *
 *   The unsigned value that is returned should have the identical bit
 *   representation as the single-precision floating-point number 2.0^x.
 *   If the result is too small to be represented as a denorm, return
 *   0. If too large, return +INF.
 * 
 *   Legal ops: Any integer/unsigned operations incl. ||, &&. Also if, while 
 *   Max ops: 30 
 *   Rating: 4
 */
unsigned floatPower2(int x) {
	int res = x + 127;
	
	if (res >= 255) return 0x7f800000;

	if (res < 0) return 0;
	return res << 23;
}

Score Rating Errors Function
4 4 0 floatPower2
Total points: 4/4


总结

一路回望,诸多不易。只能说CSAPP不愧是神书,其中的lab更是神中神,我感觉做完之后我能暴打一周前的我,感觉看完了会了跟动手实操完全是两回事,更何况这十三道题更是你没学精就是白扯的。强烈推荐有时间的朋友们一定要坚持到最后,你会感激当时坚持到最后的自己的,加油!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/951831.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Pycharm保存自定义布局

1.启用特定窗口 在View->Tool Windows下可以启用特定窗口&#xff0c;窗口标签会出现在左边&#xff08;图中红框处&#xff09;&#xff0c;下边或右边&#xff0c;可以拖动摆放位置 2.保存 在windows->layout下可以选择保存布局 1.图中第一个选项&#xff1a;选择或…

如何用bat文件调用与它在同一文件夹下的某个exe程序

第一个方案&#xff1a; 如果bat文件与某个exe程序在同一文件夹下的。那直接写那个 程序文件名字就行了。 两种写法。比如是 test.exe程序 一种 test.exe 二种 start test.exe 第一种批处理会等待test.exe程序执行完后才会运行下面的语句 第二种不会等待 这个写绝对路径好用 另…

Java实现根据商品ID获取京东商品详情数据,1688商品详情接口,1688API接口封装方法

要通过京东的API获取商品详情数据&#xff0c;您可以使用京东开放平台提供的接口来实现。以下是一种使用Java编程语言实现的示例&#xff0c;展示如何通过京东开放平台API获取商品详情&#xff1a; 首先&#xff0c;确保您已注册成为京东开放平台的开发者&#xff0c;并创建一…

JDK的组成、作用

JDK&#xff1a;java development kit java的标准开发工具包 jre&#xff1a;java runtime environment 运行基于java语言编写的程序必不可少的运行环境用于解释和执行java的字节码文件&#xff08;.class文件&#xff09;普通用户&#xff08;无开发需求&#xff09;下载jre…

python的asyncio事件循环

一、介绍 asyncio是Python标准库中的一个异步编程框架&#xff0c;它提供了一个事件循环&#xff08;event loop&#xff09;&#xff0c;用于协调异步任务的执行和结果的返回。在asyncio中&#xff0c;事件循环是一个非常重要的概念&#xff0c;它是异步编程的核心。 事件循…

3.4 可视化图表

电子表格中的图表可以使数据的表现更加直观、形象&#xff0c;帮助用户准确掌握数据间的逻辑关系。本节主要介绍了图表的构成元素&#xff0c;图表的类型&#xff0c;如何对图表区域进行管理等内容&#xff0c;针对不同的数据类型&#xff0c;创建成简单的图表&#xff0c;或创…

指针的进阶一

目录 1.字符指针 2.数组指针 3.指针数组 4.数组传参 5.函数指针 1.字符指针 int main() { const char* pstr "hello world."; printf("%s\n", pstr); return 0; } pstr中存放的就是字符串的首元素地址&#xff0c;并不是把字符串hello world 放到字符…

3D步进式漫游能够在哪些行业应用?

VR技术一直以来都是宣传展示领域中的热门话题&#xff0c;在VR全景技术的不断发展下&#xff0c;3D步进式漫游技术也逐渐覆盖各行各业&#xff0c;特别是在建筑、房产、博物馆、企业等领域应用更加广泛&#xff0c;用户通过这种技术能够获得更加直观、生动、详细的展示体验&…

FreeRTOS源码分析-13 内存管理

1 STM32编译过程及程序组成 1.1STM32编译过程 从源文件到.o文件&#xff0c;使用了armcc工具和armasm工具&#xff0c;这些keil帮我们实现了。.o不是可执行文件&#xff0c;只是目标文件。因为地址没有定义&#xff0c;没有在rom中定义地址从.o文件到镜像文件使用了armlink&am…

C语言每日一练------------Day(7)

本专栏为c语言练习专栏&#xff0c;适合刚刚学完c语言的初学者。本专栏每天会不定时更新&#xff0c;通过每天练习&#xff0c;进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字&#xff1a;两个数组的交集     双指针 &#x1f493;博主csdn个人主页&#xf…

ELK原理和介绍

为什么用到ELK&#xff1a; 一般我们需要进行日志分析场景&#xff1a;直接在日志文件中 grep、awk 就可以获得自己想要的信息。但在规模较大的场景中&#xff0c;此方法效率低下&#xff0c;面临问题包括日志量太大如何归档、文本搜索太慢怎么办、如何多维度查询。需要集中化…

AUTOSAR配置与实践(深入篇)8.2 BSW的WatchDog功能-窗口狗

AUTOSAR配置与实践&#xff08;深入篇&#xff09;8.2 BSW的WatchDog功能-窗口狗 一、为什么使用窗口狗&#xff08;Window Watchdog&#xff09;二、窗口狗初始化和喂狗流程概要三、Wdg配置项详解四、窗口狗详细流程 一、为什么使用窗口狗&#xff08;Window Watchdog&#xf…

破局主键重复问题的坎坷路 | 京东物流技术团队

伴随着业务的不断发展&#xff0c;逐渐由单库单表向分库分表进行发展。在这个过程中不可避免的一个问题是确保主键要的唯一性&#xff0c;以便于后续的数据聚合、分析等等场景的使用。在进行分库分表的解决方案中有多种技术选型&#xff0c;大概分为两大类客户端分库分表、服务…

C语言每日一练------Day(10)

本专栏为c语言练习专栏&#xff0c;适合刚刚学完c语言的初学者。本专栏每天会不定时更新&#xff0c;通过每天练习&#xff0c;进一步对c语言的重难点知识进行更深入的学习。 今日练习题关键字&#xff1a;自除数 除自身以外数组的乘积 &#x1f493;博主csdn个人主页&#xff…

Redis 持久化和发布订阅

一、持久化 Redis 是内存数据库&#xff0c;如果不将内存中的数据库状态保存到磁盘&#xff0c;那么一旦服务器进程退出&#xff0c;服务器中的数据库状态也会消失。所以 Redis 提供了持久化功能&#xff01; 1.1、RDB&#xff08;Redis DataBase&#xff09; 1.1.1 …

web SSTI 刷题记录

文章目录 前言[CISCN 2019华东南]Web11[HDCTF 2023]SearchMaster[HNCTF 2022 WEEK2]ez_SSTI[HNCTF 2022 WEEK3]ssssti[NCTF 2018]flask真香方法一方法二 [安洵杯 2020]Normal SSTI[CISCN 2019华东南]Double Secret[HZNUCTF 2023 preliminary]flask方法一方法二 前言 学习ctf也…

安达发|模拟车间模型生成生产排产计划

根据车间模型生成排产计划的一般程序可简单地描述为下面6个步骤。 1. 建模 车间模型必须详细地捕捉生产流程的特征和相应的物流&#xff0c;以便以最小的成本生成可行的计划。由于一个系统的产出率只受潜在瓶颈资源的限制&#xff0c;因此&#xff0c;我们只需对车间现有全部资…

qt day 1

this->setWindowIcon(QIcon("D:\\zhuomian\\wodepeizhenshi.png"));//設置窗口的iconthis->setWindowTitle("鵬哥快聊");//更改名字this->setFixedSize(500,400);//設置尺寸QLabel *qlnew QLabel(this);//創建一個標簽ql->resize(QSize(500,20…

浅析SOLIDWORKS空模板警告 | 使用技巧

在使用SOLIDWORKS时&#xff0c;个别用户会遇到这样的问题&#xff1a;使用SOLIDWORKS打开【.step】【.x_t】等交换档会出现如下错误提示&#xff08;或者是另存实体为零件或装配体时&#xff09;&#xff1a; 这个时候可以点击“取消”来手动载入模板&#xff0c;但是下一次打…

说说Flink中的State

分析&回答 基本类型划分 在Flink中&#xff0c;按照基本类型&#xff0c;对State做了以下两类的划分&#xff1a; Keyed State&#xff0c;和Key有关的状态类型&#xff0c;它只能被基于KeyedStream之上的操作&#xff0c;方法所使用。我们可以从逻辑上理解这种状态是一…