当前位置: 首页 > 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 小型机不断蚕食低端市场甚至组成网络干掉大型机…...

crontab 执行脚本报错,手动执行脚本正常的解决方法

一、出现的问题 有一个守护脚本XXX.sh&#xff0c;需要使用oracle用户在linux上配置定时任务&#xff0c;每1分钟检查执行一次。但是发现该脚本使用oralce用户手动启动没问题&#xff0c;能正常把程序启动起来&#xff0c;而使用crontab并没有把程序启动起来。 二、排查分析问…...

扎心话题 | 设计院背后的潜规则你知道吗?

大家好&#xff0c;我是建模助手。 大家都知道&#xff0c;在过去的2022年经济是真难&#xff01;以小编所在的广东为例&#xff0c;全年GDP增长仅1.9%。 这个数据足以呈现一个社会现象——不仅消费力咔咔下降&#xff0c;各行各业更有不同程度地嗝屁。这其中也包括一些设计院…...

【JavaEE初阶】第二节.多线程( 进阶篇 ) 锁的优化、JUC的常用类、线程安全的集合类

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、synchronized的优化操作 1.1 锁膨胀/锁升级 1.2 锁消除 1.3 锁粗化二、JUC 2.1 Callable接口 2.2 ReentrantLock类&…...

大数据核心技术是什么

大数据的核心层&#xff1a;数据采集层、数据存储与分析层、数据共享层、数据应用层&#xff0c;可能叫法有所不同本质上的角色都大同小异。 大数据的核心技术都包括什么&#xff1f; 1、数据采集 数据采集的任务就是把数据从各种数据源中采集和存储到数据存储上&#xff0c…...

「TCG 规范解读」初识 TPM 2.0 库续一

可信计算组织&#xff08;Ttrusted Computing Group,TCG&#xff09;是一个非盈利的工业标准组织&#xff0c;它的宗旨是加强在相异计算机平台上的计算环境的安全性。TCG于2003年春成立&#xff0c;并采纳了由可信计算平台联盟&#xff08;the Trusted Computing Platform Alli…...

task与function

task和function主要是有助于代码的可重用性&#xff0c;都可以在module-endmodule之外声明。 1.function 1.1.function逻辑的综合 function&#xff1a;一个只有1个wire型输出值、全是组合逻辑的函数&#xff0c;且函数名即输出信号名&#xff0c;小括号中按顺序例化输入信号。…...

Android 基础知识4-3.1 TextView(文本框)详解

一、前言 TextView就是一个显示文本标签的控件&#xff0c;就是用来显示文本。可以在代码或者 XML中设置字体&#xff0c;字体大小&#xff0c;字体颜色 &#xff0c;字体样式 &#xff08;加粗级斜体&#xff09;&#xff0c;文字截断&#xff08;比如&#xff1a;只显示10个字…...

点击化学 PEG 试剂1858242-47-3,Propargyl丙炔基-PEG1-乙酸活性酯

Propargyl-PEG1-Acetic acid-NHS ester&#xff0c;丙炔基-聚乙二醇-乙酸琥珀酰亚胺酯&#xff0c;丙炔基-PEG1-乙酸活性酯&#xff0c;丙炔基-PEG1-乙酸-NHS 酯产品规格&#xff1a;1.CAS号&#xff1a;1858242-47-32.分子式&#xff1a;C9H9NO53.分子量&#xff1a;211.174.包…...

正则表达式是如何运作的?

在日常的开发工作当中&#xff0c;我们必不可免的会碰到需要使用正则的情况。 正则在很多时候通过不同的组合方式最后都可以达到既定的目标结果。比如我们有一个需要匹配的字符串&#xff1a; hello&#xff0c;我们可以通过 / .</p>/ 以及 / .?</p>/ 来匹配&…...

JVM参数GC线程数ParallelGCThreads设置

1. ParallelGCThreads参数含义JVM垃圾回收(GC)算法的两个优化标的&#xff1a;吞吐量和停顿时长。JVM会使用特定的GC收集线程&#xff0c;当GC开始的时候&#xff0c;GC线程会和业务线程抢占CPU时间&#xff0c;吞吐量定义为CPU用于业务线程的时间与CPU总消耗时间的比值。为了承…...