当前位置: 首页 > news >正文

【CSAPP】整数运算

文章目录

  • 无符号加法
    • 练习1
    • 练习2
  • 补码加法
    • 练习1
    • 练习2
    • 练习3
    • 练习4
  • 补码的非
    • 练习
  • 无符号乘法
  • 补码乘法
    • 练习1
    • 练习2
    • 练习3
  • 乘以常数
    • 练习1
    • 练习2
  • 除以2的幂
    • 练习1
    • 练习2
  • 关于整数运算的最后思考
    • 练习

无符号加法

考虑两个非负整数xy,满足0≤x,y<2w0 \le x, y < 2^w0x,y<2w,每个数都能表示为一个w位的无符号数。如果要计算x+y,其结果的可能取值范围是0≤x+y≤2w+1−20 \le x+y \le 2^{w+1}-20x+y2w+12,表示该值可能需要w+1位。如果x+y的结果又要和别的数做加法,那可能需要更多的位表示运算结果。这种字长膨胀意味着,要想完整地表示运算的结果,我们不能对整型长度做任何限制

但实际情况是,在C语言中,整型变量占固定大小的字节和位,当整数运算结果超出了整型变量的表示范围时,计算机运算的结果是截断后的值,与预期值有偏差

我们定义操作+wu+^u_w+wuw位的无符号加法
原理:无符号数加法。
对满足0≤x,y<2w0 \le x,y<2^w0x,y<2wxxxyyy,有:
x+wuy={x+y,0≤x+y≤2w−1x+y−2w,2w≤x+y≤2w+1−2\begin{align} x+^u_wy= \begin{cases} x+y,\quad &0 \le x+y \le 2^w -1 \\ x + y-2^w, \quad &2^w \le x+y \le 2^{w+1}-2 \end{cases} \end{align} x+wuy={x+y,x+y2w,0x+y2w12wx+y2w+12

说一个算术运算溢出,是指完整的整数结果不能被有限的整型长度所表示,产生了高有效位的丢失

执行C程序时,系统不会因运算发生溢出而自己报错,因此程序员必须关注该情况。

原理:检测无符号加法中的溢出。
对满足0≤x,y≤2w−10 \le x,y \le 2^w-10x,y2w1xy,存在s=˙x+wuys\.=x+^u_wys=˙x+wuy当且仅当s<xs < xs<xs<ys<ys<y时,运算发生了溢出。

  1. 证明:当s<xs < xs<xs<ys<ys<y时,运算发生了溢出。
    因为x≥0x\ge 0x0,因此x+y≥yx+y \ge yx+yy,因此s≥ys \ge ysy,所以当s<ys<ys<y时,发生运算错误(即溢出)。
    因为y≥0y \ge0y0,因此x+y≥xx+y \ge xx+yx,因此s≥xs \ge xsx,所以当s<xs<xs<x时,发生运算错误(即溢出)。
  2. 证明:当运算发生溢出时,s<xs < xs<xs<ys<ys<y
    运算发生溢出时,s=x+y−2ws=x+y-2^ws=x+y2w,因为y<2wy<2^wy<2w,因此y−2w<0y-2^w<0y2w<0,因此s<xs<xs<x
    运算发生溢出时,s=y+x−2ws=y+x-2^ws=y+x2w,因为x<2wx<2^wx<2w,因此x−2w<0x-2^w<0x2w<0,因此s<ys<ys<y

对任何一个数xxx而言,存在−x-xx使得−x+x=0-x+x=0x+x=0,则称−x-xxxxx的加法逆元,xxx也是−x-xx的加法逆元。加法逆元即取反。
原理:无符号数取反。
对满足0≤x≤2w−10 \le x \le 2^w-10x2w1x,其w位的无符号加法逆元−wu-^u_wwu可表示为:
−wux={x,x=02w−x,x>0\begin{align} -^u_wx= \begin{cases} x,\quad &x=0\\ 2^w-x,\quad &x>0 \end{cases} \end{align} wux={x,2wx,x=0x>0

练习1

实现一个函数,如果参数xy相加不会产生溢出,这个函数就返回1

int uadd_ok(unsigned x, unsigned y)
{unsigned s = x + y;return s >= x;
}

练习2

给出下表中数的无符号加法逆元 −4u-^u_44u 的位表示。

x-x
十六进制十进制十六进制十进制
0x000x00
0x550xB11
0x880x88
0xD130x33
0xF150x11

补码加法

对满足−2w−1≤x,y≤2w−1−1-2^{w-1} \le x,y \le 2^{w-1}-12w1x,y2w11xyx + y的取值范围是−2w≤x+y≤2w−2-2^w \le x+y \le 2^w-22wx+y2w2。跟无符号加法一样,当运算结果不能用w位表示时,会截断数据,产生运算溢出

我们使用操作+wt+^t_w+wt表示w位的补码加法。
原理:补码加法。
对满足−2w−1≤x,y≤2w−1−1-2^{w-1} \le x,y \le 2^{w-1}-12w1x,y2w11xxxyyy,有:
x+wty={x+y+2w,x+y<−2w−1负溢出x+y,−2w−1≤x+y≤2w−1−1正常x+y−2w,x+y≥2w−1正溢出\begin{align} x+^t_wy= \begin{cases} x+y+2^w, \quad &x+y < -2^{w-1} \quad &负溢出\\ x+y, \quad &-2^{w-1} \le x+y \le 2^{w-1}-1 \quad &正常 \\ x+y-2^w,\quad &x+y \ge 2^{w-1} &正溢出 \end{cases} \end{align} x+wty=x+y+2w,x+y,x+y2w,x+y<2w12w1x+y2w11x+y2w1负溢出正常正溢出

bit层面,无符号加法和补码加法的运算规则是一样的,都是逢二进一
负溢出指运算结果太小了,小于−2w−1-2^{w-1}2w1;正溢出指运算结果太大了,大于2w−1−12^{w-1}-12w11。溢出产生了符号翻转。

原理:检测补码加法中的溢出。
对满足−2w−1≤x,y≤2w−1−1-2^{w-1} \le x,y \le 2^{w-1}-12w1x,y2w11xy,存在s=˙x+ys\.=x+ys=˙x+y当且仅当x>0x>0x>0y>0y>0y>0s≤0s\le0s0时,算术运算正溢出;当且仅当x<0x<0x<0y<0y<0y<0s≥0s\ge0s0时,算术运算负溢出。

  1. 证明:x>0x>0x>0y>0y>0y>0s≤0s\le0s0时,算术运算正溢出。
    预期s=x+y>0s=x+y>0s=x+y>0s≤0s\le0s0,显然s过大而无法表示,运算产生了错误(正溢出)。
  2. 证明:算术运算正溢出,因此x>0x>0x>0y>0y>0y>0s≤0s\le0s0
    运算正溢出,那么s=x+y−2ws=x+y-2^ws=x+y2w,且2w−1≤x+y≤2w−22^{w-1}\le x+y \le 2^{w}-22w1x+y2w2,因此x>0x>0x>0y>0y>0y>0,且2w−1−2w≤s≤2w−2−2w2^{w-1}-2^w \le s \le 2^{w}-2-2^w2w12ws2w22w,即−2w−1≤s≤−2≤0-2^{w-1} \le s \le -2 \le 02w1s20,即s≤0s\le0s0
  3. 证明:x<0x<0x<0y<0y<0y<0s≥0s\ge0s0时,算术运算负溢出。
    预期s=x+y<0s=x+y<0s=x+y<0s≥0s\ge0s0,显然s过小而无法表示,运算产生了错误(负溢出)。
  4. 算术运算负溢出,因此x<0x<0x<0y<0y<0y<0s≥0s\ge0s0
    运算负溢出,那么s=x+y+2ws=x+y+2^ws=x+y+2w,且−2w≤x+y<−2w−1-2^{w}\le x+y < -2^{w-1}2wx+y<2w1,因此x<0x<0x<0y<0y<0y<0,且−2w+2w≤s≤−2w−1+2w-2^{w}+2^w \le s \le -2^{w-1}+2^w2w+2ws2w1+2w,即0≤s≤2w−10 \le s \le 2^{w-1}0s2w1,即s≥0s\ge0s0

练习1

填写下表

xxxyyyx+yx+yx+yx+5tx+^t_5x+5t情况
[10100]-12[10001]-15[100101]-27[00101]5负溢出
[11000]-8[11000]-8[110000]-16[10000]-16正常
[10111]-9[01000]8[11111]-1[11111]-1正常
[00010]2[00101]5[00111]7[00111]7正常
[01100]12[00100]4[10000]16[10000]-16正溢出

练习2

实现一个函数tadd_ok,参数xy补码相加不产生溢出时,返回1

int tadd_ok(int x, int y)
{int s = x + y;return !((x > 0 && y > 0 && s <= 0) || (x < 0 && y < 0 && s >= 0));
}

练习3

如下实现存在什么问题?

int tadd_ok(int x, int y)
{int sum = x + y;return (sum - x == y) && (sum - y == x);
}

函数会永远返回1。因为并没有检测到越界的进位

练习4

下面的函数在计算x - y不溢出时,返回1

int tsub_ok(int x, int y)
{return tadd_ok(x, -y);
}

xy取什么值时,该函数会产生错误的结果?写一个该函数的正确版本。
y的取值为INT_MIN时,-y的取值也为INT_MIN。因此在计算机看来,x-y就是x+y
此时按现实的整数运算来看,如果x >= 0x-y预期运算溢出,返回0;如果如果x < 0x-y预期运算不溢出,返回1
但在计算机看来,如果x >= 0tadd_ok(x, -y)不溢出,返回1;如果x < 0tadd_ok(x, -y)溢出,返回0

我们以为它做的是减法,实际上它做的是加法。

在计算机运算中,INT_MIN的位级表示是[1, 0, …, 0],-INT_MIN的位级表示也是[1, 0, …, 0],因为[1, 0, …, 0] + [1, 0, …, 0] = [0, 0, …, 0]。当然,这不符合现实的整数运算规则。

正确的写法如下:

int tsub_ok(int x, int y)
{if (y == INT_MIN) {return !tadd_ok(x, -y);}return tadd_ok(x, -y);
}

补码的非

取非就是求加法逆元
对满足TMinw≤x≤TMaxwTMin_w \le x \le TMax_wTMinwxTMaxwx,其补码的非−wtx-^t_wxwtx表示为:
−wtx={TMinw,x=TMinw−x,TMinw<x≤TMaxw\begin{align} -^t_wx= \begin{cases} TMin_w, \quad &x=TMin_w \\ -x, \quad &TMin_w < x \le TMax_w \end{cases} \end{align} wtx={TMinw,x,x=TMinwTMinw<xTMaxw

C语言中,可以说,对于任意整数值x,因为x + ~x + 1 = 0,所以-x = ~x + 1

练习

填写下表。

xxx−4tx-^t_4x4tx
0x000x00
0x550xB-5
0x8-80x8-8
0xD-30x33
0xF-10x11

无符号乘法

两个w位的无符号数相乘,其结果可能需要2w个位才能完整表示。但在C语言中,会根据整数位宽做截断处理。

对满足0≤x,y≤2w−10 \le x,y \le 2^w-10x,y2w1xy,有:
x∗wuy=˙(x∗y)mod2w\begin{align} x *^u_w y\.=(x * y) mod 2^w \end{align} xwuy=˙(xy)mod2w

补码乘法

对满足−2w−1≤x,y≤2w−1−1-2^{w-1} \le x,y \le 2^{w-1}-12w1x,y2w11xy,有:
x∗wty=˙U2Tw((x∗y)mod2w)\begin{align} x *^t_w y\.=U2T_w((x * y) mod 2^w) \end{align} xwty=˙U2Tw((xy)mod2w)

w位无符号乘法和w位补码乘法的运算结果的低w位是一样的,区别在于解释这些位的方式。

练习1

填写下表,位宽w=3

模式xxxyyyx∗yx*yxy截断的x*y
无符号[100]4[101]5[010100]20[100]4
补码[100]-4[101]-3[001100]12[100]-4
无符号[010]2[111]7[001110]14[110]6
补码[010]2[111]-1[111110]-2[110]-2
无符号[110]6[110]6[100100]36[100]4
补码[110]-2[110]-2[000100]4[100]4

计算二进制w位的无符号乘法时,先做零扩展,扩展到2w位,再两数相乘,取低2w位。
计算二进制w位的补码乘法时,先做符号扩展,扩展到2w位,再两数相乘,取低2w位。

练习2

考虑下面的函数,它判断两个参数是否会产生溢出,不溢出返回1

int tmul_ok(int x, int y)
{int p = x * y;return !x || p/x == y;
}

x = 0时,乘法不溢出,函数返回1。和预期相符。
x不等于0时:

  1. x∗y=p+t2wx*y=p+t2^wxy=p+t2w,其中t≠0t\ne 0t=0当且仅当计算溢出。
    t≠0t\ne 0t=0时,x∗y>px*y>pxy>p或者x∗y<px*y<pxy<p,计算溢出。
    如果计算溢出,p<x∗yp<x*yp<xy或者p>x∗yp>x*yp>xy,所以t≠0t\ne 0t=0
  2. p=x∗q+rp=x*q+rp=xq+r,其中qp/xp/xp/x的结果,|r| < |x|
    rp除以x的余数,因此一定存在|r| < |x|
  3. q = y当且仅当r = t = 0
    q = y时,x∗q=p+t2wx*q=p+t2^wxq=p+t2w,因此x∗q+r=p+t2w+rx*q+r=p+t2^w+rxq+r=p+t2w+r,因此p=p+t2w+rp=p+t2^w+rp=p+t2w+r,因此0=0+t2w+r0=0+t2^w+r0=0+t2w+r,所以r = t = 0
    r = t = 0时,x∗y=x∗q+t2wx*y=x*q+t2^wxy=xq+t2w,因此y=q+t2wxy=q+\frac {t2^w}{x}y=q+xt2w,因此q = y

计算溢出时,r≠0r \ne 0r=0t≠0t \ne 0t=0,因此q≠yq\ne yq=yp/x≠yp/x \ne yp/x=y,函数返回0。反之不溢出,函数返回1

练习3

对于数据类型int32位的情况,设计一个tmul_ok函数,使用64位精度的数据类型int64_t,不使用除法。不溢出返回1

int tmul_ok(int x, int y)
{int64_t p = (int64_t)x * y;return p == (int)p;  // 截断前后的值是不是一样
}

乘以常数

在大多数机器上,整数乘法指令相当慢。因此,编译器使用了一项重要的优化,就是用移位和加减法运算的组合来代替与常数因子的乘法。当然,如果数个移位和加减法指令比一个乘法指令更耗时,那就用乘法指令。

一个整数乘以2k2^k2k等价于左移k位k≥0k \ge 0k0)。

练习1

LEA指令能够执行如(a << k) + b这样的运算。考虑b = 0或者b = ak为任意可能的值,一条LEA指令可以计算a的哪些倍数?
b = 0时,一条LEA指令可以计算a20,21,22,23,...2^0,2^1,2^2,2^3,...20,21,22,23,...倍。
b = a时,一条LEA指令可以计算a20+1,21+1,22+1,23+1,...2^0 + 1,2^1 + 1,2^2 + 1,2^3 + 1,...20+1,21+1,22+1,23+1,...倍。

练习2

填写下表。

kkk移位加法/减法表达式
621(x<<3)−(x<<1)(x<<3)-(x<<1)(x<<3)(x<<1)
3111(x<<5)−x(x<<5)-x(x<<5)x
-621(x<<1)−(x<<3)(x<<1)-(x<<3)(x<<1)(x<<3)
5522(x<<6)−x−(x<<3)(x << 6) - x - (x << 3)(x<<6)x(x<<3)

除以2的幂

在大多数机器上,整数除法比整数乘法还慢
除以2的幂可以用右移实现,无符号数使用逻辑右移,有符号数使用算术右移

对于任何实数α\alphaα,定义⌈α⌉\lceil \alpha \rceilα为唯一的整数α′\alpha'α,使得α′−1<α≤α′\alpha'-1 < \alpha \le \alpha'α1<αα
对于任何实数α\alphaα,定义⌊α⌋\lfloor \alpha \rfloorα为唯一的整数α′\alpha'α,使得α′≤α<α′+1\alpha' \le \alpha <\alpha'+1αα<α+1
对于x≥0,y>0x\ge0,y>0x0,y>0xxx除以yyy的结果是⌊x/y⌋\lfloor x/y \rfloorx/y;对于x<0,y>0x<0,y>0x<0,y>0x>0,y<0x>0,y<0x>0,y<0xxx除以yyy的结果是⌈x/y⌉\lceil x/y \rceilx/y。即向零取整

计算机执行除法运算时,不论结果正负,都是向下取整
如果要向上取整,需要给被除数加上偏置量除数-1)。
⌈x/y⌉=⌊(x+y−1)/y⌋\begin{align} \lceil x/y \rceil=\lfloor (x+y-1)/y \rfloor \end{align} x/y=⌊(x+y1)/y

C表达式(x < 0 ? x + (1 << k) - 1 : x) >> k将会计算x/2kx/2^kx/2k

同乘法不同,我们不能用右移和加减运算的组合表示除以任意常数。(乘法满足分配律,但除法不)。

练习1

写一个函数div16,返回x/16的结果。

int div16(int x)
{int sign = x >> 31;  // 符号位填满intint k = 4;int bias = (1 << k) - 1;return (x + sign & bias) >> k;
}

练习2

下面的代码中,省略了MN的定义。

int arith(int x, int y)
{return x * M + y / N;
}

编译器优化后:

int arith(int x, int y)
{int t = x;x <<= 5;x -= t;if (y < 0) {y += 7;}y >>= 3;return x + y;
}

MN的值是多少?
M = 31, N = 8

关于整数运算的最后思考

计算机执行的“整数”运算实际上是一种模运算,因为整型的有限字长限制了可能的取值范围,运算结果可能溢出。
无符号数与补码数在运算时,拥有相同的位级行为,区别在于编译器解释位的方式。

练习

int x = foo();
int y = bar();
unsigned ux = x;
unsigned uy = y;

对于下面的C表达式,
1)证明对于所有的xy,结果都为1
2)给出使他们为0xy

  1. (x>0)∣∣(x−1<0)(x > 0) || (x - 1 < 0)(x>0)∣∣(x1<0)
    x = TMin时,结果为0
  2. (x & 7) != 7 || (x << 29 < 0)
    x的低3位不都是1时,结果是1
    x的低3位都是1时,结果是1
  3. (x∗x)>=0(x * x) >= 0(xx)>=0
    运算可能会溢出,当x = 123456时,x * x的低32位是1000 1100 0111 0101 0001 0000 0000 0000,符号位是1,是负数。
  4. x<0∣∣−x<=0x < 0 || -x <= 0x<0∣∣x<=0
    如果x是非负数,-x一定是非正的。
  5. x>0∣∣−x>=0x > 0 || -x >= 0x>0∣∣x>=0
    如果x = TMin-x还是TMin,都是负数。
  6. x+y==uy+yxx + y == uy + yxx+y==uy+yx
    结果是1。无符号数与补码数有相同的位级行为,且可交换。
  7. x * ~y + uy * ux == -x
    结果是1
    补码表示中,-y = ~ y + 1,因此~ y = -y - 1。
    x * ~y + uy * ux = x * (-y - 1) + uy * ux = -xy - x + uy * ux = -x。

相关文章:

【CSAPP】整数运算

文章目录无符号加法练习1练习2补码加法练习1练习2练习3练习4补码的非练习无符号乘法补码乘法练习1练习2练习3乘以常数练习1练习2除以2的幂练习1练习2关于整数运算的最后思考练习无符号加法 考虑两个非负整数x和y&#xff0c;满足0≤x,y<2w0 \le x, y < 2^w0≤x,y<2w&…...

使用 xshell 远程连接(使用 xftp 远程传输)

xshell 和 xftp的使用都基于ssh协议&#xff0c;我们需要先在远程服务端或者虚拟机上安装ssh服务&#xff0c;然后才能远程连接。 目录 1、什么是ssh协议&#xff1f; 2、安装 openssh (1) 安装 openssh 服务器 (2) 关闭服务器防火墙&#xff08;或者开放端口22&#xff09…...

一个例子搞懂子网划分及子网掩码的计算

前置知识&#xff1a; 1、标准ip地址分为A、B、C、D、E五类&#xff0c;分类标准是ip地址的前几个比特位的值。 我们知道ip地址是32位比特-4字节组成&#xff0c;A类地址则是由首位为0&#xff0c;首字节为网络地址&#xff0c;其余3字节为主机地址组成&#xff0c;A类网络地址…...

SPI机制源码:JDK Dubbo Spring

JDK 17 Dubbo 3.1.6 JDK SPI JDK SPI在sql驱动类加载、以及slf4j日志实现加载方面有具体实现。 示例 public class Test {private static final Logger logger LoggerFactory.getLogger(Test.class);public static void main(String[] args) {ServiceLoader<JdkSpiServi…...

Spring Security+jwt+redis+自定义认证逻辑 权限控制

Spring Securityjwtredis自定义认证逻辑 权限控制 1.拦截访问基本思路 2.创建数据库表&#xff1a;角色表&#xff08;应该6个表&#xff0c;这里只用用户表代替角色表&#xff09;、权限表、路径表、角色-权限表、权限-路径表 /* SQLyog Professional v12.14 (64 bit) MySQL…...

打游戏什么蓝牙耳机好用?打游戏比较好的蓝牙耳机

游戏耳机提供身临其境的细致声音&#xff0c;同时也是与朋友在线聊天的绝佳通信设备&#xff0c;尤其对于游戏玩家来说&#xff0c;聆听和被聆听的最佳方式之一就是游戏耳机&#xff0c;那2023年到底有哪些值得购买的游戏耳机呢&#xff1f;现在就让我们一起来看看吧。 第一款…...

炔基点击交联试剂1704097-05-1,Alkyne-A-DSBSO crosslinker,发生相应点击反应

1、理论分析&#xff1a;中文名&#xff1a;炔基-A-DSBSO crosslinker&#xff0c;英文名&#xff1a;Alkyne-A-DSBSO crosslinkerCAS号&#xff1a;1704097-05-1化学式&#xff1a;C25H32N2O12S2分子量&#xff1a;616.652、产品详情&#xff1a;外观&#xff1a;白色固体&…...

刷题记录:牛客NC24309Overplanting (Silver)

传送门:牛客 题目描述: Farmer John has purchased a new machine that is capable of planting grass within any rectangular region of his farm that is "axially aligned" (i.e., with vertical and horizontal sides). Unfortunately, the machine malfunc…...

Spring Boot中使用Sa-Token实现轻量级登录与鉴权

1. Sa-Token 介绍 Sa-Token 是一个轻量级 Java 权限认证框架&#xff0c;主要解决&#xff1a;登录认证、权限认证、单点登录、OAuth2.0、分布式Session会话、微服务网关鉴权 等一系列权限相关问题。 功能结构图 2. 登录认证 对于一些登录之后才能访问的接口&#xff08;例如&…...

《分布式技术原理与算法解析》学习笔记Day20

CAP理论 什么是CAP理论&#xff1f; CAP理论用来指导分布式系统设计&#xff0c;以保证系统的可用性、数据一致性等。 C&#xff0c;Consistency&#xff0c;一致性&#xff0c;指所有节点在同一时刻的数据是相同的&#xff0c;即更新操作执行结束并响应用户完成后&#xff…...

【2023-2-23】FastDeploy 安装教程

【2023-2-22】FastDeploy 安装编译教程 该测试 FastDeploy CPU版本。 1. fastDeploy库编译 1.1 官方预编译库下载 预编译库下载安装 1.2 自定义CPU版本库编译 官方编译FastDeploy教程 CMakeGUI VS 2019 IDE编译FastDeploy 本人编译教程 CMAKE_CONFIGURATION_TYPES 属性设…...

rollup.js 一个简单实用的打包工具

最近在看vue3相关的知识的时候&#xff0c;发现了一个新的打包工具&#xff0c;至少于我而言是新鲜的。它就是rollup.js。一说到JS打包、合并、压缩、模块处理等都会想到webpack&#xff0c;这是王者&#xff0c;当然入门的难度偏高。而vue3中搭配的vite运行速度确实非常快&…...

数据结构与算法之最小爬楼梯费用动态规划

继续上一道题目&#xff0c;在上一道题目的基础之上&#xff0c;我们来解决这一道爬楼梯最小费用题。一.题目描述二.思路(动态规划五部曲)确定dp数组以及下标的含义使用动态规划&#xff0c;就要有一个数组来记录状态&#xff0c;本题只需要一个一维数组dp[i]就可以了。dp[i]的…...

阿里云ACA认证如何获取?

获取阿里云ACA&#xff08;Alibaba Cloud Certification Associate&#xff09;认证&#xff0c;需要按照以下步骤进行操作&#xff1a; 注册阿里云账号。如果您还没有阿里云账号&#xff0c;请先注册一个账号。登录阿里云官网。登录后&#xff0c;进入阿里云认证中心。选择AC…...

【Python入门第十六天】Python If ... Else

Python 条件和 If 语句 Python 支持来自数学的常用逻辑条件&#xff1a; 等于&#xff1a;a b不等于&#xff1a;a ! b小于&#xff1a;a < b小于等于&#xff1a;a < b大于&#xff1a;a > b大于等于&#xff1a;a > b 这些条件能够以多种方式使用&#xff0c…...

两数之和的解法

给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里不能重复出现。你可以按任意顺序返回答案…...

领导催我优化SQL语句,我求助了ChatGPT。这是ChatGPT给出的建议,你们觉得靠谱吗

作为一个程序员&#xff0c;无论在面试还是工作中&#xff0c;优化SQL都是绕不过去的难题。 为啥&#xff1f;工作之后才会明白&#xff0c;随着公司的业务量增多&#xff0c;SQL的执行效率对程系统运行效率的影响逐渐增大&#xff0c;相对于改造代码&#xff0c;优化SQL语句是…...

ArcGIS手动分割矢量面要素从而划分为多个面部分的方式:Cut Polygons Tool

本文介绍在ArcGIS下属ArcMap软件中&#xff0c;通过“Cut Polygons Tool”工具&#xff0c;对一个面要素矢量图层加以手动分割&#xff0c;从而将其划分为指定形状的多个部分的方法。 对于一个面要素矢量文件&#xff0c;有时我们需要对其加以划分&#xff0c;通过手动勾勒新的…...

【LeetCode】剑指 Offer 13. 机器人的运动范围 p92 -- Java Version

题目链接&#xff1a;https://leetcode.cn/problems/ji-qi-ren-de-yun-dong-fan-wei-lcof/ 1. 题目介绍&#xff08;13. 机器人的运动范围&#xff09; 地上有一个m行n列的方格&#xff0c;从坐标 [0,0] 到坐标 [m-1,n-1] 。一个机器人从坐标 [0, 0] 的格子开始移动&#xff0…...

[oeasy]python0091_仙童公司_八叛逆_intel_8080_altair8800_牛郎星

编码进化 个人电脑 计算机 通过电话网络 进行连接 极客 利用技术 做一些有趣的尝试 极客文化 是 认真研究技术的 文化 计算机 不再是 高校和研究机构高墙里面的 神秘事物而是 生活中常见的 家用电器 ibm 蓝色巨人脚步沉重 dec 小型机不断蚕食低端市场甚至组成网络干掉大型机…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

使用VSCode开发Django指南

使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架&#xff0c;专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用&#xff0c;其中包含三个使用通用基本模板的页面。在此…...

视频字幕质量评估的大规模细粒度基准

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用&#xff0c;因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型&#xff08;VLMs&#xff09;在字幕生成方面…...

Matlab | matlab常用命令总结

常用命令 一、 基础操作与环境二、 矩阵与数组操作(核心)三、 绘图与可视化四、 编程与控制流五、 符号计算 (Symbolic Math Toolbox)六、 文件与数据 I/O七、 常用函数类别重要提示这是一份 MATLAB 常用命令和功能的总结,涵盖了基础操作、矩阵运算、绘图、编程和文件处理等…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战

“&#x1f916;手搓TuyaAI语音指令 &#x1f60d;秒变表情包大师&#xff0c;让萌系Otto机器人&#x1f525;玩出智能新花样&#xff01;开整&#xff01;” &#x1f916; Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制&#xff08;TuyaAI…...

HTML前端开发:JavaScript 常用事件详解

作为前端开发的核心&#xff0c;JavaScript 事件是用户与网页交互的基础。以下是常见事件的详细说明和用法示例&#xff1a; 1. onclick - 点击事件 当元素被单击时触发&#xff08;左键点击&#xff09; button.onclick function() {alert("按钮被点击了&#xff01;&…...

SpringTask-03.入门案例

一.入门案例 启动类&#xff1a; package com.sky;import lombok.extern.slf4j.Slf4j; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.cache.annotation.EnableCach…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的

修改bug思路&#xff1a; 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑&#xff1a;async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...

Kafka入门-生产者

生产者 生产者发送流程&#xff1a; 延迟时间为0ms时&#xff0c;也就意味着每当有数据就会直接发送 异步发送API 异步发送和同步发送的不同在于&#xff1a;异步发送不需要等待结果&#xff0c;同步发送必须等待结果才能进行下一步发送。 普通异步发送 首先导入所需的k…...

iview框架主题色的应用

1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题&#xff0c;无需引入&#xff0c;直接可…...