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

还是那句话,千万不要慌,千万不要着急,耐下性子慢慢来,一步一个脚印,把基础打的牢牢的,一样不比那些人差。回到实验本身,自从​​​​​​按照西工大计算机学院计算机系统基础实验一(环境配置)-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)));
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

CMMI5大成熟度等级和4大过程域

CMMI&#xff08;Capability Maturity Model Integration&#xff0c;能力成熟度模型集成&#xff09;模型系列是帮助组织改进其过程的最佳实践的集合。这些模型由来自产业界、政府以及软件工程研究所&#xff08;Software Engineering Institute&#xff0c; SEI&#xff09;的…

2024年十大最好猫罐头有哪些?2024年10款最好的猫罐头盘点

我发现不少人有这样的困扰&#xff01;买到各种数值都很好的猫罐头后&#xff0c;猫咪一点都不吃。或者是猫咪吃了猫罐头之后&#xff0c;吃了一段时间后就软便身体不舒服。 通过本文&#xff0c;我将与大家盘点2024年10款最好的猫罐头&#xff0c;并提供一些选购猫罐头的小妙招…

JavaSE基础50题:6. 求出0~999之间的所有“水仙花数”并输出

概念 “水仙花数”是指一个三位数&#xff0c;其各位数字的立方和确好等于该数本身。 如&#xff1a;153 135333,则153是一个“水仙花数”。 【方法】 如何获得每一位的数&#xff1a;如(153) 个位: 153 % 10 3 十位: 153 / 10 15 15 % 10 5 百位: 153 / 100 1 代码 pu…

SimplePIR——目前最快单服务器匿踪查询方案

一、介绍 这篇论文旨在实现高效的单服务器隐私信息检索&#xff08;PIR&#xff09;方案&#xff0c;以解决在保护用户隐私的同时快速检索数据库的问题。为了实现这一目标&#xff0c;论文提出了两种新的PIR方案&#xff1a;SimplePIR和DoublePIR。这两种方案的实现基于学习与错…

浅谈基于Pytest框架的自动化测试开发实践

Pytest是Python的一种易用、高效和灵活的单元测试框架&#xff0c;可以支持单元测试和功能测试。本文不以介绍Pytest工具本身为目的&#xff0c;而是以一个实际的API测试项目为例&#xff0c;将Pytest的功能应用到实际的测试工程实践中&#xff0c;教大家将Pytest用起来。 在开…

JFrog Artifactory—高性能软件制品管理仓库

产品概述 JFrog Artifactory是一个可扩展的通用二进制存储库管理器&#xff0c;可在整个应用程序开发和交付过程中自动管理工件和依赖项。JFrog Artifactory支持大多数开发语言&#xff0c;是整个DevOps流水线中大多数软件包、容器映像和Helm图表的单一数据源。Artifactory对元…

二叉搜索树——模拟

对于一个无穷的满二叉排序树&#xff08;如图&#xff09;&#xff0c;节点的编号是1,2,3&#xff0c;…。对于一棵树根为X的子树&#xff0c;沿着左节点一直往下到最后一层&#xff0c;可以获得该子树编号最小的节点&#xff1b;沿着右节点一直往下到最后一层&#xff0c;可以…

Java TCP协议实现一对一聊天与UDP协议实现群聊案例

JavaTCP协议实现一对一聊天与UDP协议实现群聊案例 1.TCP协议实现一对一聊天 1.1服务端运行结果 1.2客服端运行结果 1.3代码汇总 服务端 package twentyone;import java.io.IOException; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.…

2023.12.5 关于 Spring Boot 统一数据格式返回

目录 引言 统一数据格式 实例理解 特殊 String 类型处理 实例理解 分析返回的流程 补充知识 分析报错原因 解决方案一 解决方案二 最终测试 引言 统一数据格式能 方便前端程序员更好的接收和解析后端返回的数据统一数据格式能 降低约定前后端交互接口的成本&#xf…

Vue2中v-html引发的安全问题

前言&#xff1a;v-html指令 1.作用&#xff1a;向指定节点中渲染包含html结构的内容。 2.与插值语法的区别&#xff1a; (1).v-html会替换掉节点中所有的内容&#xff0c;{{xx}}则不会。 (2).v-html可以识别html结构。 3.严重注意&#xff1a;v-html有安全性问题&#xff0…

搭梯子之后电脑连接WIFI打不开浏览器网页:远程计算机或者设备不接受连接

问题描述&#xff1a; 打不开网页&#xff0c;但是能正常使用微信等app windows网络诊断&#xff1a; 远程计算机或者设备不接受连接 解决办法&#xff1a; 电脑搜索【internet选项】 进入连接&#xff0c;点击局域网设置&#xff0c;将里面的代理服务器选项关掉就可以正常打开…

总结|哪些平台有大模型知识库的Web API服务

截止2023/12/6 笔者个人的调研&#xff0c;有三家有大模型知识库的web api服务&#xff1a; 平台类型文档数量文档上传并解析的结构api情况返回页码文心一言插件版多文档有问答api&#xff0c;文档上传是通过网页进行上传有&#xff0c;而且是具体的chunk id&#xff0c;需要设…

【Java】实现顺序表基本的操作(数据结构)

文章目录 前言顺序表1、打印顺序表2、增加元素3、在任意位置增加元素4、判断是否包含某个元素5、查找某个元素对于的位置6、获取任意位置的元素7、将任意位置的元素设为value8、删除第一次出现的关键字9、获取顺序表长度10、清空顺序表总结 前言 在了解顺序表之前我们要先了解…

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

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

LLM大语言模型(一):ChatGLM3-6B本地部署

目录 前言 本机环境 ChatGLM3代码库下载 模型文件下载 修改为从本地模型文件启动 启动模型网页版对话demo 超参数设置 GPU资源使用情况 &#xff08;网页对话非常流畅&#xff09; 前言 LLM大语言模型工程化&#xff0c;在本地搭建一套开源的LLM&#xff0c;方便后续的…

一致性哈希详解

目录 一. 前言 二. 一致性哈希算法 三. Redis Cluster 的一致性哈希算法 四. Java 实现的一致性哈希 五. 分库分表中一致性哈希实践 5.1. 基于 hash 环一致性哈希算法的分库分表 5.2. 美团一致性哈希算法 5.3. 平均分布方案 一. 前言 普通的 hash 算法&#xff08;hash…

Ubuntu 20.04 安装 mysql8 LTS

Ubuntu 20.04 安装 mysql8 LTS sudo apt-get update sudo apt-get install mysql-server mysql --version mysql Ver 8.0.35-0ubuntu0.20.04.1 for Linux on x86_64 ((Ubuntu)) Ubuntu20.04 是自带了 MySQL8. 几版本的&#xff0c;低于 20.04 则默认安装是 MySQL5.7.33 s…

Day03 linux高级系统编程--进程

概念 进程与程序的区别 进程&#xff1a;一个正在运行的代码就叫做进程&#xff0c;是动态的&#xff0c;会占用内存 程序&#xff1a;一段封装好的待运行的代码或可执行文件&#xff0c;是静态的&#xff0c;会占用磁盘空间 单道与多道程序 单道&#xff1a;程序一个一个…

[NAND Flash 2.1] NAND Flash 闪存改变了现代生活

依公知及经验整理&#xff0c;原创保护&#xff0c;禁止转载。 专栏 《深入理解NAND Flash》 <<<< 返回总目录 <<<< ​ 1989年NAND闪存面世了&#xff0c;它曾经且正在改变了我们的日常生活。 NAND 闪存发明之所以伟大&#xff0c;是因为&#xff0c…

Hello World

世界上最著名的程序 from fastapi import FastAPIapp FastAPI()app.get("/") async def root():return {"message": "Hello World"}app.get("/hello/{name}") async def say_hello(name: str):return {"message": f"…