西工大计算机学院计算机系统基础实验一(函数编写1~10)

news2025/1/22 12:38:45

还是那句话,千万不要慌,千万不要着急,耐下性子慢慢来,一步一个脚印,把基础打的牢牢的,一样不比那些人差。回到实验本身,自从​​​​​​按照西工大计算机学院计算机系统基础实验一(环境配置)-CSDN博客 这篇博客结束完成虚拟机平台VMware 17 Workstation Pro的安装,以及Ubuntu虚拟机的导入,还有实验包的导入之后,我们看到了如下图所示的实验压缩包content_1701767947881.tar,如 图1:查看被导入到Ubuntu虚拟机的实验包的压缩包content_1701767947881.tar 所示。接着我们解压缩这个包,如 图2:解压缩实验压缩包content_1701767947881.tar 所示。

图1:查看被导入到Ubuntu虚拟机的实验包的压缩包content_1701767947881.tar) 

 

图2:解压缩实验压缩包content_1701767947881.tar。使用"tar xvf content_1701767947881.tar"命令解压实验压缩包之后,得到了lab1-handout文件夹) 

接着进入到lab1-handout文件夹,并且查看该lab1-handout文件夹下有什么文件,如 图3:进入lab1-handout文件夹,查看该文件夹下的文件 所示。 但是千万不要急着,什么都不懂就开始做,先耐下性子来慢慢读一读README文件,了解清楚lab1-handout这个文件夹是用来干什么的,如 图4:使用less命令查看README文件 、图5:查看README文件的第一页图6:查看README文件的第二页 所示。这其中可能有很多大家不熟悉的命令,但千万不要排斥它,跟着作者一步一步来就可以。

图3:进入lab1-handout文件夹,查看该文件夹下的文件) 

 (图4:使用less命令查看README文件

 (图5:查看README文件的第一页

 

 (图6:查看README文件的第二页

在这里不要害怕怎么读,不要害怕说因为它是英文,所以就感到害怕。不要害怕,耐下性子慢慢读,就可以读出来一二的。在这里它的大概意思是,我们需要编写bits.c文件中的几个函数的函数体,接着使用dlc可执行文件检查bits.c文件中我们所写的函数是否满足运算符等的要求,然后使用make clean命令清除掉上一次已生成的可执行文件,再使用make btest文件生成可执行文件,最后运行生成的可执行文件价差我们所写的函数的正确性。你可能听不懂这段话是什么意思,不要怕,你跟着作者做,后面都会详细的讲到的。接着使用同样的方法,我们来查看bits.c文件,如 图7:查看bits.c文件(上)图8:查看bits.c文件(下) 所示。

图7:查看bits.c文件(上)

 (图8:查看bits.c文件(下)

 bits.c文件开头的一大段注释给我们三个要点信息:

要点1:不要使用"#include <stdio.h>",我们可以得到要点2与要点3:

要点2:对于整型数,只能使用& ^ | + << >> ! ~这八个运算符,只能定义并使用int型的局部变量以及函数参数变量,只能使用0x0到0xFF的int型常量;

要点3:对于浮点数,只能使用& ^ | + << >> ! ~这八个运算符,可以定义并使用int型或unsigned int型的局部变量以及函数参数变量,可以使用任意有符号整型与无符号整型常量,可以使用循环与条件判断。

大家记住它就好,不要深究,考虑到有些同学的Ubuntu没有内置VS code,而且vim编辑器对于初学者来说难度也有点大,所以我们选择Ubuntu内置的文本编辑器,开始编辑bits.c中的第一个函数,如 图9:使用Ubuntu内置的文本编辑器,开始编辑bits.c中的第1个函数 所示。如果文本编辑器的大小过小,可以按照 图10:调大文本编辑器显示文字的大小(上) 、图11:调大文本编辑器显示文字的大小(下) 所示。

 (图9:使用Ubuntu内置的文本编辑器,开始编辑bits.c中的第1个函数

图10:调大文本编辑器显示文字的大小(上)) 

图11:调大文本编辑器显示文字的大小(下)) 

定位到第174行,我们开始编写第一个函数bitXor,如 图12:定位到第174行,开始编写第1个函数bitXor 所示。

图12:定位到第174行,开始编写第1个函数bitXor

bitXor的意思是什么呢?意思是,需要我们只使用取反和位与运算,来实现异或操作。即只使用~与&,来实现^操作。那么该怎么实现这个功能呢?根据异或操作的定义,相同为0,不同才为1。也就是说,0^0=0,0^1=1,1^0=1,1^1=0。观察这个例子,我们发现,只要其中有并且只有1个为1即可。即~x&y和x&~y一个需要为1,一个需要为0,可以写成(~x&y)|(x&~y),但是不允许使用位或操作,那么我们应该怎么做呢?再思考下去就很麻烦了。我们不妨换一种思路,当x&y与~x&~y都为0时,这时只对应着两种情况,0^1=1与1^0=1,然后对x&y和~x&~y取反,得到~(x&y)和~(~x&~y),这时只有当0^1=1与1^0=1这两种情况下,~(x&y)和~(~x&~y)才都为1,进而~(x&y)&~(~x&~y)才为1,所以只需要写一个语句 "return ~(x&y)&~(~x&~y)"即可。如 图13:编写完成第1个函数bitXor 所示。接着保存对bits.c文件的修改,然后在包含bits.c文件的文件夹中打开命令行,如 图14:在包含bits.c文件的文件夹中打开命令行 所示。接着使用命令"./dlc -e bits.c"查看运算符的数量是否满足要求以及是否满足其它的要求。如果除了对各个函数所使用到的运算符进行计数之后就没有其它的输出,那么表明满足运算符和其它的要求。接着使用"make clean"命令清除掉上一次遗留的旧的文件,如 图15:使用命令"./dlc -e bits.c"和命令"make clean" 所示。接着再使用命令"make btest"生成新的文件,生成btest这个新的可执行文件之后,使用命令“./btest -f bitXor”来检验我们所写的第一个函数bitXor的正确性,其中"-f"选项制定了需要被检验的函数名,在这里需要被检验的函数名是bitXor。如 图16:使用命令"make btest"和命令“./btest -f bitXor” 所示。我们已成功编写了bitXor函数。

图13:编写完成第1个函数bitXor) 

图14:在包含bits.c文件的文件夹中打开命令行) 

图15:使用命令"./dlc -e bits.c"和命令"make clean" 。使用命令"./dlc -e bits.c"查看运算符的数量是否满足要求以及是否满足其它的要求。如果除了对各个函数所使用到的运算符进行计数之后就没有其它的输出,那么表明满足运算符和其它的要求。接着使用"make clean"命令清除掉上一次遗留的旧的文件) 

 

 (图16:使用命令"make btest"和命令“./btest -f bitXor”

 接着第二个函数,isZero,当x为0时,返回1,当x不为0时,返回0,所以只需要简单的写"return !x"即可,如 图17:编写第2个函数isZero图18:重复编写第1个函数时的操作 所示。

图17:编写第2个函数isZero

 (图18:重复编写第1个函数时的操作。使用命令"./dlc -e bits.c"统计各个函数使用到的运算符的个数,使用命令"make clean"清除掉上一次遗留下来的旧的可执行文件,使用命令"make btest"生成新的btest可执行文件,使用命令"./btest -f isZero"检验所写函数isZero的正确性)

第三个函数,thirdBits,要我们自己产生一个int型的数,保证它从最低有效位开始,每第三个比特位被设置为1,即期望我们返回的数是:0100 1001 0010 0100 1001 0010 0100 1001B。但是根据要点二中的一句话:只能使用0x0到0xFF的int型常量,即我们不能直接返回它。那么应该怎么产生这个数呢?我们发现,可以先产生一个小于0xFF的int型常量,让它既满足从最低有效位开始,每第三个比特位被设置为1,又满足小于0xFF,而这个数就是0x49,它的二进制表示形式为0100 1001。接着让0x49左移9位,得到了1001 0010 0000 0000,左移9位的目的就是为了让其既能保证,除了低9位以外,从最低有效位开始,每第三个比特位被设置为1,又是0x49左移所能完成这个任务的极限。接着将0x49与0x49<<9拼凑在一起,得到了0000 0000 0000 0000 1001 0010 0100 1001,它结合了0x49和0x49<<9的优点,保证了最大程度上从最低有效位开始,每第三个比特位被设置为1。但是,最高的16个比特位还没有被处理,而这可以简单的通过((0x49<<9)+0x49)<<18来实现。最后将0x49、0x49<<9与((0x49<<9)+0x49)<<18拼凑起来,即为最终的答案。而为了节省运算符,我们使用int型变量t来保存((0x49<<9)+0x49),接着"return t+(t<<24)"即可。具体的五个步骤为:

  1. 期望的输出: 0100 1001 0010 0100 1001 0010 0100 1001

  2. 第一个步骤: 0000 0000 0000 0000 0000 0000 0100 1001 0x49

  3. 第二个步骤: 0000 0000 0000 0000 1001 0010 0000 0000 0x49<<9

  4. 第三个步骤: 0000 0000 0000 0000 1001 0010 0100 1001 (0x49<<9)+0x49

  5. 第四个步骤: 0100 1001 0010 0100 0000 0000 0000 0000 ((0x49<<9)+0x49)<<18

  6. 第五个步骤: 0100 1001 0010 0100 1001 0010 0100 1001 (((0x49<<9)+0x49)<<18)+(0x49<<9)+0x49

图19:编写第3个函数thirdBits 所示。

 (图19:编写第3个函数thirdBits

第4个函数anyOddBit,如果x中,只要有一个第奇数个比特位被设置为了1,那么就返回1,否则返回0,比如7是0111,其第0、1、2个比特位为1,满足第1个比特位被设置为1,返回1;比如5是0101,第0、2个比特位为1,不满足第奇数个比特位被设置为1,也就是第1个比特位没有被设置为1,所以返回0,注意这里特别容易混淆,作者因为搞混了这一点,废了好多功夫。我们的思路就是,先产生1010 1010 1010 1010 1010 1010 1010 1010,这个数是0xAAAAAAAA,它第1、3、5、7、9、11... ...31个比特位都被设置为了1,然后将0xAAAAAAAA与x做位与操作,这样子获取x的所有奇数比特位,如果x中存在一个奇数比特位被设置为1,那么位与的结果就不为0,此时连用两个逻辑非!,即可得到1,如果x中所有奇数比特位都是0,那么位与的结果就是0,此时连用两个逻辑非!,即可得到0。那么我们该如何得到0xAAAAAAAA呢?可以按照下面的五个步骤来得到0xAAAAAAAA。为了节省运算符,引入int a=0xAA,int b=0xAA<<8,int c=a+b,int d=(c<<16)+c,这时d即为0xAAAAAAAA。然后编写第四个函数anyOddBit,如 图20:编写第4个函数anyOddBit 所示。

  1. 期望的输出: 1010 1010 1010 1010 1010 1010 1010 1010 0xAAAAAAAA

  2. 第一个步骤: 0000 0000 0000 0000 0000 0000 1010 1010 0xAA

  3. 第二个步骤: 0000 0000 0000 0000 1010 1010 0000 0000 0xAA<<8

  4. 第三个步骤: 0000 0000 0000 0000 1010 1010 1010 1010 (0xAA<<8)+0xAA

  5. 第四个步骤: 1010 1010 1010 1010 0000 0000 0000 0000 ((0xAA<<8)+0xAA)<<16

  6. 第五个步骤: 1010 1010 1010 1010 1010 1010 1010 1010 (((0xAA<<8)+0xAA)<<16)+((0xAA<<8)+0xAA)

图20:编写第4个函数anyOddBit) 

第5个函数,isEqual,如果两个int型数相等,那么返回1,否则返回0,我们直接!(x^y)即可。如 图21:编写第5个函数isEqual 所示。

图21:编写第5个函数isEqual) 

第6个函数,leastBitPos,可以理解为,找到从左到右最后一个1的位置,然后其它位置都设为0。对于96来说,96可以写成0110 0000,最低位的1是从右往左第5个,所以返回0010 0000;对于104来说,104可以写成0110 1000,从左到右最后一个1的位置是第3个,所以返回0000 1000。那么我们该怎么做呢?发现可以将x各位取反然后加1,并将这个结果与x进行位与,这时返回的结果即为我们期望中的结果。比如对于96,也就是0110 0000来说,各位取反得到了1001 1111,再加1得到了1010 0000,然后将这个数与0110 0000进行位与操作,得到了0010 0000,正好是我们想要的结果,所以我们"return ((~x)+1)&x;"即可,如 图22:编写第6个函数leastBitPos 所示。

图22:编写第6个函数leastBitPos

接着第7个函数,isPositive, 如果x大于0的话返回1,如果x不大于0的话返回0。该怎么做呢?只需要判断符号位即可。该怎么获取符号位呢?可以将x右移31位,因为一方面针对int型变量的右移都是算术右移,另外一方面实验也规定了所有的右移都是算术右移,所以我们将x右移31位,这样所有的比特位都和符号位是一样的取值了。这时得到!(x>>31),如果x为正,则符号位为0,x>>31为0,逻辑非后为1;如果x为负,则符号位为1,x>>31为0xFFFFFFFF,逻辑非后为0。另外考虑到当x为0时,本想让其返回0,结果此时!(x>>31)的结果也是1,所以需要修正,修正的结果为!(x>>31)&!!x,进而可以写成!(!x|x>>31)。当x为0时,!x为1,!x|x>>31直接为1,!(!x|x>>31)为0;当x为负数时,!x为0,x>>31为0xFFFFFFFF,!(!x|x>>31)为0;当x为正数时,!x为0,x>>31也为0,进而!(!x|x>>31)为1,按照这个思路,我们写出了"return !(!x|x>>31)",如 图23:编写第7个函数isPositive 所示。

图23:编写第7个函数isPositive) 

第8个函数,ezThreeFourths,开始慢慢变复杂了,我们需要完美复现C语言表达式x*3/4,那么该怎么做呢?首先计算x*3,x*3可以用位运算表示为(x<<1)+x,接着计算x/4,这里并不能简单的((x<<1)+x)>>2。为什么呢?因为如果简单的这样做以后,会存在当x为负数时舍入的问题,比如当x=-1、-2、-3、-5、-6、-7... ...时,((x<<1)+x)>>2会比x*3/4小1,而当x=-4、-8、-12时,((x<<1)+x)>>2才会与x*3/4相等。所以为了解决这个问题,进行修正,设a=(x<<1)+x,修正为(a+(a>>31)&0x3)>>2,这样子就可以啦!如 图24:编写第8个函数ezThreeFourths 所示。

(图24:编写第8个函数ezThreeFourths)

第9个函数,isLessOrEqual。首先从大方向上来看,存在一个或的情况,也就是说,当x等于y时也返回1,所以大框架为:

(                                                       ) | (    !(x^y)    )

这样子解决了或的问题,下一步就应该要解决isLess的问题。怎么解决这个问题呢?第一反应是通过计算x-y=x+~y+1,根据结果的符号位来判断是否小于。但问题在于,虽然一般情况下这种方法是对的,但如果是一个很小的负数减去一个很大的正数,或者一个很大的正数减去一个很小的负数,这时int类型就无法表示相减的结果,甚至无法表示1-0x8000 0000的结果。所以就需要根据int类型能不能放得下相减的结果,来进行分类讨论。那么如何判断int类型能不能放得下相减的结果呢?我们发现,只有当x与y异号时才存在溢出的问题,所以我们可以将x与y是否同号作为分类依据,这样子大框架进一步细分为:

((    (x^~y)&(            )    |    (        )   ) >>31)&1 | (    !(x^y)    )

当x与y同号时,x与~y异号,x^~y的符号位为1,此时x-y的符号位为即为我们想返回的结果,所以直接返回x-y即可,这时大框架即为:

((    (x^~y)&(x+~y+1)    |    (        )   ) >>31)&1 | (    !(x^y)    )

而当x与y异号时,x与~y同号,x^~y的符号位为0,此时选择x&~y,如果x符号位为0,那么x一定大于y,最终应该返回0,而x&~y恰好就是0;如果x符号位为1,那么x一定小于y,最终应该返回1,而x&~y恰好就是1。利用这个性质,最终的大框架即可完成:

((    (x^~y)&(x+~y+1)    |    (     x&~y   )   ) >>31)&1 | (    !(x^y)    )

而如果只选择直接看x的符号位是否为1,而不是选择x&~y的话,有可能出现x与y同号并且x-y符号位为0并且x符号位为1,这时(x^~y)&(x+~y+1)符号位为0,x符号位为1,0|1为1,返回1,但我们想要其返回0,这就出现了冲突。为了避免这个冲突,就需要保证当x与y同号,x^~y的符号位为1时,我们选择的表达式一定为0,所以这才选择了x&~y。有些同学会问,那我们最开始的时候,为什么不写成(           !!(x^y)&()                                            ) | (    !(x^y)    ),是不是也是这个道理呢?对。因为当!(x^y)为1,即x==y时,!!(x^y)&()中的()一定为0,所以我们才选择省略了!!(x^y)。最终,如 图25:编写第9个函数isLessOrEqual 所示。

图25:编写第9个函数isLessOrEqual

 第10个函数,rotateLeft,将x旋转左移n位。比如0x87654321左移4位得到了0x76543218,该怎么得到0x76543218呢?我们发现,其由两部分组成,分别是0x76543210与0x8。0x76543210可直接由x<<4得到,0x8可有x>>28然后与0xF做位与得到。最终4可被n代替,28可被32+~n+1代替,那么如何得到0xF呢?最省运算符的方法是,~0+(1<<n)。所以按照这个思路,我们可写出表达式为"(x<<n)|((x>>(32+~n+1))&(~0+(1<<n)))",最终如 图26:编写第10个函数rotateLeft 所示。

图26:编写第10个函数rotateLeft

/* 
 * 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);
}
/*
 * isZero - returns 1 if x == 0, and 0 otherwise 
 *   Examples: isZero(5) = 0, isZero(0) = 1
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 2
 *   Rating: 1
 */
int isZero(int x) {
  return !x;
}
/* 
 * thirdBits - return word with every third bit (starting from the LSB) set to 1
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 8
 *   Rating: 1
 */
int thirdBits(void) {
  int t=0x49+(0x49<<9);
  return t+(t<<18);
}
/* 
 * anyOddBit - return 1 if any odd-numbered bit in word set to 1
 *   Examples anyOddBit(0x5) = 0, anyOddBit(0x7) = 1
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 12
 *   Rating: 2
 */
int anyOddBit(int x) {
  int a=0xAA;
  int b=a<<8;
  int c=a+b;
  int d=c+(c<<16);
  return !!(x&d);
}
/* 
 * isEqual - return 1 if x == y, and 0 otherwise 
 *   Examples: isEqual(5,5) = 1, isEqual(4,5) = 0
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 5
 *   Rating: 2
 */
int isEqual(int x, int y) {
  return !(x^y);
}
/* 
 * leastBitPos - return a mask that marks the position of the
 *               least significant 1 bit. If x == 0, return 0
 *   Example: leastBitPos(96) = 0x20
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 6
 *   Rating: 2 
 */
int leastBitPos(int x) {
  return ((~x)+1)&x;
}
/* 
 * isPositive - return 1 if x > 0, return 0 otherwise 
 *   Example: isPositive(-1) = 0.
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 8
 *   Rating: 2
 */
int isPositive(int x) {
  return !(x>>31|!x);
}
/*
 * ezThreeFourths - multiplies by 3/4 rounding toward 0,
 *   Should exactly duplicate effect of C expression (x*3/4),
 *   including overflow behavior.
 *   Examples: ezThreeFourths(11) = 8
 *             ezThreeFourths(-9) = -6
 *             ezThreeFourths(1073741824) = -268435456 (overflow)
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 12
 *   Rating: 3
 */
int ezThreeFourths(int x) {
  int a=(x<<1)+x;
  return (a+((a>>31)&0x3))>>2;
}
/* 
 * 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) {
return ((((((x+~y+1)&(x^~y))|(x&~y))>>0x1f))&1)|!(x^y);
}
/* 
 * rotateLeft - Rotate x to the left by n
 *   Can assume that 0 <= n <= 31
 *   Examples: rotateLeft(0x87654321,4) = 0x76543218
 *   Legal ops: ~ & ^ | + << >> !
 *   Max ops: 25
 *   Rating: 3 
 */
int rotateLeft(int x, int n) {
  return (x<<n)|((x>>(32+~n+1))&(~0+(1<<n)));
}

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

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

相关文章

Qt-Q_OBJECT宏使用与“无法解析的外部符号qt_metacall/metaObject/qt_metacast“

有时候我们编写Qt类的时候&#xff0c;修改代码时直接加上Q_OBJECT宏&#xff0c;然后直接构建&#xff0c;会报如下错误&#xff1a; 这里的几个函数的声明是由Q_OBJECT宏引入的&#xff0c;而其对应的实现是由moc实现的&#xff0c;如果我们更新了代码但是没有执行qmake&…

自媒体创作辅助工具有哪些?四款必备图文工具推荐

自媒体创作需要有哪些辅助工具&#xff0c;今天我们要探讨的话题是自媒体图文工具&#xff0c;这是我们在打造引人入胜内容时的得力助手。在这个信息过剩的时代&#xff0c;图文内容已经成为自媒体传播的核心。为了使我们的内容脱颖而出&#xff0c;我们需要一些专业的工具来提…

大话数据结构-查找-多路查找树

注&#xff1a;本文同步发布于稀土掘金。 7 多路查找树 多路查找树&#xff08;multi-way search tree&#xff09;&#xff0c;其每个结点的孩子可以多于两个&#xff0c;且每一个结点处可以存储多个元素。由于它是查找树&#xff0c;所有元素之间存在某种特定的排序关系。 …

回溯-组合总和

LeetCode链接 本题k相当于树的深度&#xff0c;9&#xff08;因为整个集合就是9个数&#xff09;就是树的宽度。 例如 k 2&#xff0c;n 4的话&#xff0c;就是在集合[1,2,3,4,5,6,7,8,9]中求 k&#xff08;个数&#xff09; 2, n&#xff08;和&#xff09; 4的组合。 …

分享一个Python网络爬虫数据采集利器

前言 你是否曾为获取重要数据而感到困扰&#xff1f;是否因为数据封锁而无法获取所需信息&#xff1f;是否因为数据格式混乱而头疼&#xff1f;现在&#xff0c;所有这些问题都可以迎刃而解。让我为大家介绍一款强大的数据收集平台——亮数据Bright Data。 作为世界领先的数据…

单周爆售150w+,“不是羽绒服买不起,而是军大衣更有性价比”

拼多多收盘市值超过阿里&#xff0c;成在美中概股市值第一。 截至美股收盘&#xff08;11月30日&#xff09;&#xff0c;拼多多收盘市值超过阿里巴巴&#xff0c;成为在美中概股中的市值第一股。拼多多收涨4.03%&#xff0c;报147.44美元&#xff0c;市值1959亿美元&#xff…

数据中心的操作系统——kubernets

操作系统的功能和模块与 Kubernetes 的功能和模块做了一个对比&#xff1a; Kubernetes 作为数据中心的操作系统还是主要管理数据中心里面的四种硬件资源&#xff1a;CPU、内存、存储、网络。 对于 CPU 和内存这两种计算资源的管理&#xff0c;我们可以通过 Docker 技术完成。…

mybatis-plus框架报错:Invalid bound statement(not found)

查找原因&#xff1a; 如果是第三个地方的错误&#xff0c;错误原因如下&#xff1a; 解决办法&#xff1a; 1、在pom.xml添加 <build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-pl…

Excel 删除空白行

目录 一. 方式一: 筛选删除二. 方式二: 定位条件三. 方式三: 隐藏非空白行&#xff0c;删除空白行 一. 方式一: 筛选删除 选中空白行对应的列&#xff0c;按下Ctrl Shift L&#xff0c;给列添加过滤条件。过滤出空白行&#xff0c;然后删除即可。 二. 方式二: 定位条件 按下…

选择更好的Notes索引附件方式

大家好&#xff0c;才是真的好。 首先介绍最近产品更新消息。在上一周&#xff0c;HCL主要发布了以下几个产品更新&#xff1a;HCL Verse 3.2.0、HCL Volt MX Go 2.0.2、HCL Domino Rest API 1.0.8。 HCL Verse是今后Domino的产品当中主要使用的webmail功能&#xff0c;这一次…

Nero刻录光盘软件-极好用

目录 一、下载Nero 二、软件安装 三、刻录数据 前言 刻录之前准备一张新的光盘&#xff0c;之前一旦使用过&#xff0c;就无法刻录&#xff0c;一定要新的光盘。 一、下载Nero nero官网下载地址&#xff1a;Nero下载 csdn免费下载地址&#xff1a;https://download.csdn.…

【PyTorch】多项式回归

文章目录 1. 模型与代码实现1.1. 模型1.2. 代码实现1.2.1. 完整代码1.2.2. 输出结果 2. Q&A2.1. 欠拟合与过拟合 1. 模型与代码实现 1.1. 模型 将多项式特征值预处理为线性模型的特征值。即 y w 0 w 1 x w 2 x 2 ⋯ w n x n y w_0w_1xw_2x^2\dotsw_nx^n yw0​w1​…

自动生成实体类,mapper类和mapper.xml文件(解放双手,定义好数据库表就不要手写啦)

背景 建的表有四十多个字段&#xff0c;建好了已经很累了&#xff0c;映射成Javabean还要再写一次&#xff01;&#xff01; 吐槽 在建立好了sql表之后&#xff0c;我们已经写了一次建表了&#xff0c;难道还要我们自己再一次手写模Java模型吗&#xff0c;我的表有几十个字段…

10_企业架构NOSQL数据库之MongoDB

企业架构NOSQL数据库之MongoDB 学习目标和内容 1、能够简单描述MongoDB的使用特点 2、能够安装配置启动MongoDB 3、能够使用命令行客户端简单操作MongoDB 4、能够实现基本的数据操作 5、能够实现MongoDB基本安全设置 6、能够操作安装php的MongoDB扩展 一、背景描述及其方案设计…

Linux访问NFS存储及自动挂载

本章主要介绍NFS客户端的使用 创建NFS服务器并通过NFS共享一个目录在客户端上访问NFS共享的目录自动挂载的配置和使用 1.1 访问NFS存储 前面那篇介绍了本地存储&#xff0c;本章就来介绍如何使用网络上上的存储设备。NFS即网络文件系统&#xff0c;所实现的是Linux和Linux之…

IDEA快速生成lambda表达式的方法

IDEA快速生成lambda表达式的方法-CSDN博客 建议修改成 shift/

Redis对象

Redis根据基本数据结构构建了自己的一套对象系统。主要包括字符串对象、列表对象、哈希对象、集合对象和有序集合对象 同时不同的对象都有属于自己的一些特定的redis指令集&#xff0c;而且每种对象也包括多种编码类型&#xff0c;和实现方式。 Redis对象结构 struct redisOb…

使用TouchSocket适配一个c++的自定义协议

这里写目录标题 说明一、新建项目二、创建适配器三、创建服务器和客户端3.1 服务器3.2 客户端3.3 客户端发送3.4 客户端接收3.5 服务器接收与发送 四、关于同步Send 说明 今天有小伙伴咨询我&#xff0c;他和同事&#xff08;c端&#xff09;协商了一个协议&#xff0c;如果使…

二叉树的右视图[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给定一个二叉树的 根节点root&#xff0c;想象自己站在它的右侧&#xff0c;按照从顶部到底部的顺序&#xff0c;返回从右侧所能看到的节点值。 示例 1: 输入: [1,2,3,null,5,null,4] 输出: [1,3,4] 示例 2: 输入: [1,null,3] 输出…

强化学习第1天:强化学习概述

☁️主页 Nowl &#x1f525;专栏《机器学习实战》 《机器学习》 &#x1f4d1;君子坐而论道&#xff0c;少年起而行之 ​​ 文章目录 介绍 强化学习要素 强化学习任务示例 环境搭建&#xff1a;gym 基本用法 环境信息查看 创建智能体 过程可视化 完整代码 结语…