二进制运算以及源码、补码、反码概念讲解

二进制“原码、反码、补码”详解 二进制之“原码反码补码” 阅读详情

前言

在学习框架源码底层时,有非常多的二进制运算,由于大学学习计算机基础时开小差,没有学习牢固,所以在看底层源码的算法逻辑时遇到二进制运算比较吃力,遂通过一篇博文来总结下二进制运算,记录一下。

读者认真阅读完整片文章,看完如果还不懂可以来砍我~

正文

1. 二进制基础

因为计算机底层是通过二进制来进行计算的,所以在计算机底层会将十进制转换为二进制。十进制就是逢10进1,二进制就是逢2进1。

就十进制来说,比如一百可以分为三位,个位、十位、百位, 用位数在下列表示 101这个十进制数。

百位十位十位
101

因此对于十进制来说,越往上进制位越大,比如千位、万位。

同理,对于二进制来说也有对应位数, 如果表示二进制的4。

4(2^2)2(2^1)1(2^0)
100

1 * 4 + 2 * 0 + 1 * 0 = 4

如果要表示二进制的5,则如下图

4(2^2)2(2^1)1(2^0)
101

4 * 1 + 2 * 0 + 1 * 1 = 5

如果要表示二进制的11,则如下图

8(2^3)4(2^2)2(2^1)1(2^0)
1011

8 * 1 + 4 * 0 + 2 * 1 + 1 * 1 = 11

在计算机中,1字节有8位二进制位。

2. 二进制运算

在计算机系统中,二进制运算包括了二进制逻辑运算和二进制算术运算,而逻辑运算和算术运算的主要区别在于,逻辑运算是按位进行,不像算术运算中位与位之间有进位和借位的联系。下面介绍的与、或、异运算就属于二进制的逻辑运算。

2.1 二进制逻辑运算

对于二进制的逻辑运算,记住一个口诀:

  1. 与(&)运算

    运算规则:
    0&0=0, 0&1=0, 1&0=0, 1&1=1

    二者为1则为1,否则都为0。

  2. 或(|)运算

    运算规则:
    0|0=0,0|1=1,1|0=1,1|1=1

    遇1则1,否则为0。

  3. 异(^)或运算

    运算规则:
    0^0=0, 1^0=1, 0^1=1, 1^1=0

    同为0,异为1。

由于算术运算中会设计符号数的运算,所以先介绍二进制中的源码、补码以及反码。

2.2 二进制算术运算

在二进制算术运算中,包括加、减、乘、除。

加法

0 + 0 = 1
1 + 1 = 10
1 + 0 = 1
0 + 1 = 1

乘法

0 × 0 = 0
1 × 0 = 0
0 × 1 = 0
1 × 1 = 1

减法

0-0=0
1-0=1
1-1=0
0-1=1

除法

0÷1=0
1÷1=1

3. 二进制的源码、补码以及反码

二进制源码是什么?

由于数字有正负之分,所以在计算机中通过在一个数的二进制的最高位存放符号(0为正,1为负),而其他数值位存放着就是数值的二进制位, 这就是二进制源码。需要知道的是,正数的源码、补码和反码都是一样的。

源码有缺点,就是不能直接进行运算,因为运算会出错。源码是有符号数的最简单的编码方式,便于输入输出,但作为代码加减运算时较为复杂。

二进制反码是什么?

反码通常是用来由源码求补码或者由补码求源码的过度码,根据定义可以根据补码的整数和小数中"0"的表示形式各有2中,+0和-0不一样。以8位机器数为例,
整数的"+0"源码为:0,0000000,反码为:0,0000000。整数的"-0"源码为:1,0000000,反码为:1,1111111。

反码跟源码是正数时一样,为负数是,除符号位外,其他为所有数值取反。

一句话概括就是,反码是用于计算负数补码的过度码。

二进制补码是什么?

由于数字有正负之分,所以在计算机中通过在一个数的二进制的最高位存放符号(0为正,1为负),而这就是机器数的补码。还需要知道的一点是,在计算机中是负数是以补码的形式存储的,由于正数的源码和补码相同,所以正数以源码或者补码的形式存储在计算机中都是正确的说法,而负数的源码和补码则不相同。二进制运算后,会将补码结果转换为源码之后,再计算其十进制值。

总结起来补码的作用就是:

  1. 使符号位能与有效值部分一起参加运算,从而简化运算规则.
  2. 使减法运算转换为加法运算,进一步简化计算机中运算器的线路设计 所有这些转换都是在计算机的最底层进行的,而在我们使用的汇编、C等其他高级语言中使用的都是原码。

源码和反码之间怎么转换?

源码除了最高位的符号位外,其他位数全部取反,得到的就是反码。

补码和反码之间怎么转换?

补码则是在反码的基础上加一。

小结

对于源码、补码和反码,三者均有符号位和数值位两部分,最高位为符号位,其余位均为数值位。符号位用0表示正,1表示负,而数值位三者表示方法都不同。在计算机系统中,数值一律用补码来
表示和存储,原因在于补码可以将符号位和数值域统一处理,同时加法和减法也可以同一处理,此外源码和补码互相转换,其运算过程是相同的,不需要额外的硬件电路。
一个负整数和其补数相加和为模,对一个整数的补码再求补码等于该整数自身,补码的正零与负零表示方法相同。

4. 二进制的移位运算符

在二进制中,移位运算符是一种位操作运算符。移位运算符可以在二进制的基础上对数字进行平移。按照平移的方向和位数填充规则可以将移位运算符分为三种:<<(左移)、>>(有符号右移)和>>>(无符号右移)。

4.1 <<(左移)

<<表示的是左移,将运算数的二进制整体左移指定的位数,低位用0补齐,因此左移不存在有符号和无符号的区别。

例如在java中int类型的十进制数16,由于在java中,int类型占4字节,1字节有8位, 所以其二进制源码表示为:

0000 0000 0000 0000 0000 0000 0001 0000

16 << 2 ,就是相当于将16的二进制数整体左移2为,然后低位补0,移位操作后:

0000 0000 0000 0000 0000 0000 0100 0000

那么我们再来看下对于负数的左移运算。

-16,其二进制源码为:
1000 0000 0000 0000 0000 0000 0001 0000

反码:
1111 1111 1111 1111 1111 1111 1110 1111

补码:
1111 1111 1111 1111 1111 1111 1111 0000

-16 << 2 , 对补码进行向左移2位, 低位补0
1111 1111 1111 1111 1111 1111 1100 0000
由于移位后最高位仍然为1,表示负数,所以需要借助反码来运算

反码为补码 - 1,则结果为:
1111 1111 1111 1111 1111 1111 1011 1111

源码为反码取反,则结果为:
1000 0000 0000 0000 0000 0000 0100 0000
-1 * (2 * 2 ^ 6) = -64

小结:对于左移运算,a << b,相当于 a * 2 ^ b。

4.2 >> (有符号右移)

在计算机中>> 表示有符号右移,就是将二进制整体右移指定位数,如果是正数,则高位用0补齐,如果是负数,则高位用1补齐。

仍然用java中16和-16来进行有符号右移操作,

16 >> 2

通过二进制补码是运算,最终结果为4,同样的-16 >> 2 结果为-4,详细的通过二进制运算结果这里就不展示了,参考左移中列出的详细步骤。

小结:对于有符号右移来说,如果是正数,移动指定位数后,高位用0来补齐;如果是负数,高位用1补齐。

4.3 >>>(无符号右移)

在计算机中通过>>>来表示无符号右移,不管是正数还是负数,高位都用0来补齐。

对于正数,无符号右移>>>和有符号右移>>结果都相同。

同样的用java中16和-16来进行无符号右移运算。

16 >>> 2 结果为 4。

而对于负数来说,无符号右移结果就需要进行计算了。

-16的补码为:
1111 1111 1111 1111 1111 1111 1111 0000

则无符号右移,结果为:
0011 1111 1111 1111 1111 1111 1111 1100

由于正数的源码、补码和反码都一样,所以移位后的源码为:
0011 1111 1111 1111 1111 1111 1111 1100,计算二进制得。

1 * 2 ^ 29 + 1 * 2 ^ 28 + 1 * 2 ^ 27 + 1 * 2 ^ 26 + … + 1 * 2 ^ 2 = 1073741820。

tip 可以通过小技巧来快速计算结果

聪明的读者估计能发现,在二进制位数中,高位的十进制值为其余右边进制之和 + 1,读者可以自行去验证。
所以,

0011 1111 1111 1111 1111 1111 1111 1100
^
取该位置计算得出的十进制值,然后-1,再减去 1 * 2^1 + 1 * 2 ^ 0,即:
2 ^ 30 - 1 - 2 ^ 1 - 2 ^ 0 =1073741824 - 1 - 2 - 1 = 1073741820。

在这里插入图片描述

5. 示例

比如变量 a & (-a) 用二进制怎么运算:

10 & (-10)

&是按位与,首先在计算机中数字都是以补码的形式存在的,比如:

int a = 10

+10,它的源码为:

0000 0000 0000 0000 0000 0000 0000 1010

由于正数的源码和补码相同,所以它的补码为:

0000 0000 0000 0000 0000 0000 0000 1010

对于-10,

它的源码为:

0000 0000 0000 0000 0000 0000 1000 1010

它的反码是源码的数值域取反,即:

1111 1111 1111 1111 1111 1111 1111 0101

它的补码是反码+1,即:

1111 1111 1111 1111 1111 1111 1111 0110

由于二进制运算都是用补码来计算的,所以 a & (-a) ,就是:

0000 0000 0000 0000 0000 0000 0000 1010 & 1111 1111 1111 1111 1111 1111 1111 0110 = 0000 0000 0000 0000 0000 0000 0000 0010

对于二进制来说,由于最高位为0,所以可以知道该数为正数,所以源码、补码和反码都一样。
而由于除开最高位符号位外的所有高位都为0,所以可以只看低四位,即0010,换算十进制后为2。

所以如果a=10,则 10 & (-10) = 2。

算完了&,那么再来计算下 ^ 和 | ,看下计算机中是如何通过补码来计算的。

10 ^ (-10)

由于10的补码为:
0000 0000 0000 0000 0000 0000 0000 1010
-10的补码为:
1111 1111 1111 1111 1111 1111 1111 0110

则10 ^ -10 的补码结果为:
1111 1111 1111 1111 1111 1111 1111 1100

由于最高位为1,则该数为负数,需要借助反码来计算其源码。

反码为补码 - 1,则结果为:
1111 1111 1111 1111 1111 1111 1111 1011

源码为反码取反,结果为:
1000 0000 0000 0000 0000 0000 0000 0100
则十进制结果为-4。

10 | (-10)

由于10的补码为:
0000 0000 0000 0000 0000 0000 0000 1010
-10的补码为:
1111 1111 1111 1111 1111 1111 1111 0110

由于最高位为1,则该数为负数,需要借助反码来计算其源码。

则10 | -10 的补码结果为:
1111 1111 1111 1111 1111 1111 1111 1110
反码结果为补码 - 1,则结果为:
1111 1111 1111 1111 1111 1111 1111 1101
源码为反码结果取反,结果为:
1000 0000 0000 0000 0000 0000 0000 0010

计算的十进制结果为 -2。

在这里插入图片描述

通过一个简单的示例分析,相信读者已经弄清楚了源码、补码和反码之间的关系以及在二进制运算中是如何运用的了。

在开源框架底层中算法会用到大量的二进制运算, 例如:在最近学习的Netty底层源码中,DefaultEventExecutorChooserFactory的底层源码有一个方法, 就是通过 a & (-a)来运算的。

@Override
public EventExecutorChooser newChooser(EventExecutor[] executors) {
    if (isPowerOfTwo(executors.length)) {
        return new PowerOfTowEventExecutorChooser(executors);
    } else {
        return new GenericEventExecutorChooser(executors);
    }
}
/*
 * 用于计算val是否是2的幂,例如2、4、8、16
 */
private static boolean isPowerOfTwo(int val) {
   return (val & -val) == val;
}

private static final class PowerOfTowEventExecutorChooser implements EventExecutorChooser {
    private final AtomicInteger idx = new AtomicInteger();
    private final EventExecutor[] executors;

    PowerOfTowEventExecutorChooser(EventExecutor[] executors) {
        this.executors = executors;
    }

    /*
     * 通过二进制与运算计算出下标索引值,原理如下:
     * 假设:idx = 2 , 二进制表示为:0000 0010
     * executors.length = 16, 则executors.length - 1 = 15, 二进制表示为:0000 1111
     * 
     * 由于是与运算,且executors.length高四位为0000,则只需要注意低四位的运算。
     * 则: 0010 & 1111 = 0010 ,十进制表示为2,
     * 
     * 所以如果idx = 3, 则二进制为:0011 & 1111 = 0011 也为3,
     * 等idx = 16时,二进制为:0001 0000 & 1111 = 0000 0000 ,即十进制的1,
     * 这样就实现了在0 ~ 15 范围内循环获取下标索引的目的。
     */
    @Override
    public EventExecutor next() {
        return executors[idx.getAndIncrement() & executors.length - 1];
    }
}

private static final class GenericEventExecutorChooser implements EventExecutorChooser {
    private final AtomicInteger idx = new AtomicInteger();
    private final EventExecutor[] executors;

    GenericEventExecutorChooser(EventExecutor[] executors) {
        this.executors = executors;
    }

    /*
     * 通过取余运算,计算出下标索引
     */
    @Override
    public EventExecutor next() {
        return executors[Math.abs(idx.getAndIncrement() % executors.length)];
    }
}

总结

在计算机中,二进制的运算是比较重要的,可以看到在Java的许多开源框架底层就运用到了大量的二进制与或非运算,所以学好二进制的基础概念是非常重要的。

【计算机组成原理】一文搞懂原码、反码、补码和位运算符(左移右移按位与异或等) 在计算机当中都是使用补码来进行计算和存储的。补码很好的解决了反码负数不能跨零计算的弊端,并且补码还可以记录一个特殊的值 -128,这个数据在 1 个字节下是没有原码和反码学习了原码、反码和补码的知识之后,我们就可以了解到,Java 当中所有的基本数据类型。比如整数类型的数据类型,存储的数都是同样的,区别是在于什么地方,假设存储的值都是 10在C语言中除了算数操作符、关系操作符、逻辑操作符外还有一类操作符 “ 位操作符 ”。 阅读详情

相关推荐

保姆级教程:用CameraX API快速搞定Android多摄像头切换与预览(附避坑指南)

本文提供了一份详细的CameraX API教程,帮助开发者快速实现Android多摄像头切换与预览功能。通过简化API设计和生命周期感知能力,CameraX大幅降低了开发复杂度,同时解决了多摄像头兼容性、预览优化等常见问题。文章包含完整代码示例和实战避坑指南,特别适合需要高效集成相机功能的Android开发者。

weixin_42699679的博客 165

二进制数的源码,反码,补码

(1)原码 符号位用0表示正数,用1表示负数(用八位表示) +57原码= 00111001        -57原码=10111001 +0原码 = 00000000        -0原码=10000000 (2)反码:正数的反码就是原码,负数的反码除符号位不变,其余按位求反 +57反码= 00111001        -57反码=11000110 (3)补码:正数的补码就是原码,负...

alex1997222的博客 4330

[V-10]ARMv8/v9-CPU Virtualization-CPU虚拟化架构简介(vCPU/vPE)

本文简要介绍了CPU虚拟化架构的基础知识。

基层架构师的分享 1266

【二进制中的源码、补码、反码】

二进制的源码、补码、反码

Dabiancheng的博客 621

Android13 CarPowerManagementService启动流程分析

在CarPowerManagementService中init调用PowerHalService的setListener设置事件侦听器以接收车辆的电源事件。

liuning1985622的博客 956

【BigWorld 游戏服务器引擎】Cell 架构设计介绍,及Java实现方案的探索

横向扩展(Scalability):通过动态增减CellApp和BaseApp的数量,可以轻松应对玩家人数的变化。世界可以做得非常大,只需增加更多的 Cell。负载分离(Load Separation):将不同性质的负载分离,避免了单一进程瓶颈。CPU 密集型的实时计算(CellApp)和 I/O 密集型的数据操作(BaseApp)互不影响。高效的视野管理(AOI):每个 Cell 只关心自己区域内和边界上的实体,大大降低了计算复杂度。容错性:某个CellApp。

代码时光 1203

原码、反码、补码

原码、反码、补码的概念 原码、反码、补码 0的问题 原码、反码、补码 表示范围 二进制转十进制

周天祥的博客 6万+

Dify使用教程3:Dify创建工作流

Dify使用教程3:Dify创建工作流 接着,我们连接下一个节点:“LLM”填入上下文变量为:result。这时候知识库就添加成功了。添加新节点:结束节点。

拥抱具身智能,昇腾Ascend C 5127

重学Android:从位运算到二进制表示(零)

以下内容针对非科班同学,可以快速掌握位运算和二进制表示等计算机基础运算知识,看过源码的同学都知道,源码中大量运用了位运算知识,如果你对这方面不了解的话,看起来是比较困难的,如果你工作接触到蓝牙数据,串口数据收发等内容,这方面更是你必须了解的。

WriteBug001的博客 1356

Agile Modbus使用和学习笔记

i < len;这里仅仅需要提供获取函数即可,离散输入是只读类型i++) {return 0;只读类型寄存器i++) {return 0;i < len;

Car12 167

“华为杯”研究生数学建模竞赛2020年-【华为杯】E题:能见度估计与预测(附获奖论文及python代码实现)

因此,题目要求借助机场的 AMOS 观测数据中的气压、温度、湿度、风速等气象因子,达到 100% 时,空气中的水汽便会凝结成细微的水滴悬浮于空中,使地面水平的能见度下。传统的仪器探测法成本高,覆盖范围小,而基于视频的能见度检测能弥补仪器测量的不足之处,但是预测精度不高,需要进一步改。象条件,空气质量的影响,其中较为关键的影响因子是雾和霾。性过强,激光能见度仪的检测方法更为可信,但是激光能见度仪覆盖的检测范围小,安装。覆盖的交通视频路况数据间接计算得到能见度数值的方法,此方法成本较低,覆盖范围广。

getusushu的博客 2280

java位运算符详解

java位运算中主要需注意两点: 1. 十进制怎么转为二进制以及二进制的计算 2. 源码、反码、补码如何得到 3. 十进制加法为逢十进一;二进制为逢二进一 4. 负数在计算机中是以补码的形式表示的 以下为java位运算的例子及解析 public static void main(String[] args) { /* 2 0010 * 3...

qq_41644017的博客 313

芯片原厂linux驱动开发的分享

大家好,我是XX,来自湖南XX学院,电子信息18级,也曾在创新基地控制组学习过两三年,毕业后就职于一家芯片原厂的解决方案部,担任驱动工程师的职位,算上实习期,我的工作时长已有两年。在此我想将这两年期间学习与积累到的一些经验输出出来,与大家一同分享。知识面有限,只能简单介绍一些驱动开发方向的一些经验,且由于经验尚浅,文中难免会有一些疏漏和错误之处,还请大家积极地批评指正。

嵌入式技术开发 844

进制转换,

**其他(二 八 十六)进制转换为十进制** 二进制以 0b 开头, 算法: 从右边开始算 实际是 2的(位数-1)次方 相加 ob1011 = 1+ 2 + 0 + 8 = 11 (十进制) 十六进制的用法: 0x开头 A表示10 B表示11 0x23A = 10 * 16 ^ 0 + 3 * 16 ^ 1 + 2 * 16 ^ 2 十进制转换成其他进制 注意!因为一个字节有八位,所以 0B100010 —> 电脑显示 00100010 八进制以0开头 14 —> E , 13—&gt.

xjjjsbsbj的博客 1593

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

计算机底层知识:“十进制、二进制”

/在有符号类型中 第一位是符号位 符号位为零 则表示正数符号为 1 表示复数。//反码 就是在源码基础上除符号位之外去反0 变 1 一变零。//数据存储到计算机中的最小单位是 字节 byte。// 1000 0001 // -1 的源码。//在计算机中存储数据的最小单位 bit。//2. 二进制转化为十进制 用乘法。// 二进制数值加减运算通过补码进行。//源码 数值本身对应的二进制编码。//十进制转化为二进制 用除法。//补码 在反码的基础上加1。//正数 源码反码补码一样。

2401_86981937的博客 447

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

汇编自学11

二进制 0 1 10 11 100 101 110 111 1000 1001 1011 1111 10000 10001 十六进制 0 1 2 3 4 5 6 7 8 9 a b c d e f ...

m0_58158837的博客 438

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

快速十进制与二进制的互转

快速十进制与二进制的互转

MMMMMMMay 532

计算机组成原理之计算篇

进制运算的基本知识 进制运算的基础: 1.进制的概述: 进位制是一种记数方法,亦称进位计数法或位值计数法 有限种数字符号来表示无限的数值 使用的数字符号的数目称为这种进制的基数或底数 常见的进制:八进制(0~7)、十六进制(0~9A-Aa-f)、二进制(0、1)、二十进制、六十进制(时间、坐标、角度等量化数据) 2.二进制运算的基础: a.二进制转十进制, b.十进制转二进制, c.小数的二进制转换为十进制, d.小数的十进制转二进制, ...

小白小白从不日别的博客 556

C语言第三课

c语言初学者笔记

cx不会编程的博客 313

day03-java基础-常见运算符

文章目录运算符 运算符 算术运算符:+,-,*,% 关系运算符:>= <= == != 逻辑运算符:与&&(表示并且关系 ) 或||(表示或者的关系 只有有一个成立就是成立) 非(表示否定取反) 自加和自减运算符:++a,a++,–a,a– 三目运算符:格式:表达式?值1:值2 //相当于if语句表示表达式成立把值1赋给它,反之赋值值2 赋值运算符:= //将右侧的值赋值给左侧 += // a+=10 <==> a =

weixin_52368930的博客 351

python源反补,进制转换,运算符

进制 常用的四种进制,二进制,八进制,十进制,十六进制 二进制用0b开头 bin() 满2进1 本位跳0 数字为0.1 八进制是0o开头 oct() 满8进1 本位跳0 数字为1.2.3.4.5.6.7 十进制 int() 满10进1 本位跳0 数字为1.2.3.4.5.6.7.8.9 十六进制是x开头 hex() 满进1 本位跳0 最大数字为1.2.3.4.5.6.7.8.9.a.b.c.d.e.f 进制转换方法一 转为二进制bin()

weixin_44263028的博客 514

数据的表示(软考笔记)

数据的表示(软考笔记)

weixin_53389471的博客 215

java基础

1. 常量 字符串常量 整数常量 小数常量 字符常量:单个数字,单个字母,单个符号 布尔常量 空常量 2. 进制 二进制:0/1组成,以0b开头,b大小写都可以,JDK7可以表示二进制 八进制:0-7,0开头 十进制:整数默认 十六进制:0-F,0x开头 进制转换: 3. 源码反码补码 3.1. 源码 就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小...

c.......p 147

js 位运算你了解吗?

名词介绍 有符号: 无符号表示全部的整数,包含负数和正数 无符号: 有符号代表全部是正整数,不包含负数的整数 源码: 计算机存储数字都是以二进制进行存储,并且第一位 数字为 0 表示正数, 1表示负数,所以二进制称为源码, 比如 2 的二进制 0000 0010 反码: 对所有二进制进行取反操作, 1 变成 0, 0变成 1, 当前数字为负数时,第一位数字不变(代表正负数), 比如 2 的反码 0111 1101, -2 的反码 1111 1101 补码: 所有负数都是以补码进行存储,补码表现形式为 先求出

c_liufeng的博客 504

操作符整理——C语言

计算机中二进制存储及处理;操作符内容整理

m0_71429662的博客 189

数据类型,数据类型转换以及进制转换

一,字面值常量 *字符串常量 用双引号括起来的内容 *整数常量 所有整数 *小数常量 所有小数 *字符常量 用单引号扩起来的内容,里面只能放单个数字,单个字母或单个符号 (’'中放的必须是单个字符,10代表的是1字符和0字符 ''中什么也不放也是不可以的,因为代表不了任何字符) *布尔常量 较为特殊的只有true和false *空字符 null 二,进制 A:什么是进制 进制:就是进

mlynb的博客 922
上一篇: 深入浅出SpringBoot源码——监听器与事件机制
下一篇: 后端学习Vue系列之——基础知识总结篇
CoderBruis
博客等级 码龄10年 4444粉丝 102原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值