计算机系统实验之datalab

2023-11-02

datalab实验是CSAPP中关于整数和浮点数的位运算的实验,对于我们理解位运算和整数,浮点数的位级表示有着很好的帮助。

实验目的

修改bits.c的C语言代码,使其通过所有在不违反任何编码准则的情况下,在btest中进行测试,进一步熟悉整型及浮点数的位表达形式,实现常用二进制运算的常用方法。

实验环境

个人电脑PC,linux环境,dlc编译环境

实验内容及操作步骤

实验内容

(1).替换bits.c中各个函数中的return,实现相应功能,并通过btest测试,具体格式如下:
int Funct(arg1, arg2, …) {
/* brief description of how your implementation works */
int var1 = Expr1;
int varM = ExprM;
varJ = ExprJ;

varN = ExprN;
return ExprR;
}
(2).补充函数要求如下:
每一个“Expr”只能使用如下规则:
① 数字只能使用0到255(0xff),不能使用像0xffffffff这样大的数字
② 函数参数和局部变量(没有全局变量)
③ 一元运算目:! ~
④ 二元运算目:& ^ | + << >>
下面的操作不被允许:
① 使用任何控制结构,如if, do, while, for, switch等。
② 定义或使用任何宏。
③ 在此文件中定义任何其他函数。
④ 调用任何库函数。
⑤ 使用任何其他的操作,如&&, ||, -, or ?:
⑥ 使用任何形式的casting
⑦ 使用除int以外的任何数据类型。这意味着你不能使用数组、结构等。
对于需要你执行浮点运算的问题,编码规则较不严格。允许使用循环和条件控制也可以同时使用int和unsigned。可以使用任意整数和无符号常量。

操作步骤

(1).首先将代码包datalab-handout复制到Ubuntu系统中(复制之前需要安装好vmware-tools),接下来的实验都是在该文件目录下进行。
(2).补充bits.c中的所有函数,并遵循实验内容中提到的补充规则,另外需要注意编码过程中运算符的合法性和最大操作符数。
(3).实现代码如下

  • 函数1
要求
bitAnd - x&y using only ~ and | 
 *   Example: bitAnd(6, 5) = 4
 *   Legal ops: ~ |
 *   Max ops: 8
 *   Rating: 1
代码实现
int bitAnd(int x, int y) {
  return ~((~x) | (~y));
}
代码解释:实现x和y的按位与运算,由于有运算符数量的限制,这里可以采用德摩根律进行转化后再求解,即x & y=~~(x&y)=~((~x)|(~y))
  • 函数2
要求
getByte - Extract byte n from word x
 *   Bytes numbered from 0 (LSB) to 3 (MSB)
 *   Examples: getByte(0x12345678,1) = 0x56
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 6
 *   Rating: 2
代码实现
int getByte(int x, int n) {
    return (x>>(n<<3))&0xff;
}
代码解释:首先将所取字节移动到最右边,再和0xff相与使得前面3个字节清零。
  • 函数3
要求
logicalShift - shift x to the right by n, using a logical shift
 *   Can assume that 0 <= n <= 31
 *   Examples: logicalShift(0x87654321,4) = 0x08765432
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 20
 *   Rating: 3
代码实现
int logicalShift(int x, int n) {
  int mask=(((~(1<<31))>>n)<<1)+1;
  return mask&(x>>n);
}
代码解释:逻辑右移是左端补0,算术右移是填充符号位,这里直接将x右移得到的是算术右移的结果,这里需要产生一个掩码mask来消除算术右移n的符号位,采用的办法是0相与消除符号位,其余部分和1相与不变。
  • 函数4
要求
bitCount - returns count of number of 1's in word
 *   Examples: bitCount(5) = 2, bitCount(7) = 3
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 40
 *   Rating: 4
代码实现
int bitCount(int x) {
  int count; 
    int tmp1 = (0x55)|(0x55<<8); 
    int mask1 = (tmp1)|(tmp1<<16); 
    int tmp2 = (0x33)|(0x33<<8); 
    int mask2 = (tmp2)|(tmp2<<16); 
    int tmp3 = (0x0f)|(0x0f<<8); 
    int mask3 = (tmp3)|(tmp3<<16); 
    int mask4 = (0xff)|(0xff<<16); 
    int mask5 = (0xff)|(0xff<<8); 
    count = (x&mask1)+((x>>1)&mask1); 
    count = (count&mask2)+((count>>2)&mask2); 
    count = (count + (count >> 4)) & mask3; 
    count = (count + (count >> 8)) & mask4; 
    count = (count + (count >> 16)) & mask5; 
    return count; 
}
代码解释:输入一个整型数字,输出该数字二进制表示中有多少个1,可以通过二分法进行查找进行记录,先计算每两位中1的个数,并用对应的2位来进行存储,然后计算每四位中1的个数,用对应的4位进行存储,最后得到16位中1的个数,即x中1的个数
  • 函数5
要求
bang - Compute !x without using !
 *   Examples: bang(3) = 0, bang(0) = 1
 *   Legal ops: ~ & ^ | + << >>
 *   Max ops: 12
 *   Rating: 4
代码实现
int bang(int x) {
  return ~((x|(~x+1))>>31)& 1;
}
代码解释:不使用!而实现!功能。第一步~x+1求补码,与x本身进行相或后得到最高有效位,如果大于0那么最高有效位必为1,将该数逻辑右移31位后得到要么全零要么全1的数,然后与1相与得到一个相反的值就可以实现!的操作。
  • 函数6
要求
tmin - return minimum two's complement integer 
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 4
 *   Rating: 1
代码实现
int tmin(void) {
  return 1<<31;
}
代码解释:0x80000000的补码是其本身,这里直接将1左移31位即可。
  • 函数7
要求
fitsBits - return 1 if x can be represented as an 
 *  n-bit, two's complement integer.
 *   1 <= n <= 32
 *   Examples: fitsBits(5,3) = 0, fitsBits(-4,3) = 1    0101   1100 100
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 15
 *   Rating: 2
代码实现
int fitsBits(int x, int n) {
  int shift=32+(~n)+1;
  return !(x^((x<<shift)>>shift));//*左移32-n位,再右移32-n位,最后和原数比较*/
}
代码解释:对于正数来说,从第32位到第n位必须全是0,因此左移(32-n)位再右移(32-n)位一定和原数相同,如果不相同,一定是因为第32位到第n位有至少一个1。对于负数,也是类似的情形,从32位到第n位必须全是1,这里定义一个移位数shift,将左移右移之后的结果和原数x比较,相同则可表示。另解!(((x >> (n+(~0))) + 1)>>1)
  • 函数8
divpwr2 - Compute x/(2^n), for 0 <= n <= 30
 *  Round toward zero
 *   Examples: divpwr2(15,1) = 7, divpwr2(-33,4) = -2
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 15
 *   Rating: 2
代码实现
int divpwr2(int x, int n) {
    return (x+((x>>31)&((1<<n)+(~0))))>>n;//x需要加上一个偏移量m=x>0?x:x+2^k-1
代码解释:x除以2的n次方,实际上直接右移n位即可,面对负数时需要加上一个偏移量2^n-1。详细解释可以参看《深入理解计算机系统》(第2版)37页。
  • 函数9
要求
negate - return -x 
 *   Example: negate(1) = -1.
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 5
 *   Rating: 2
代码实现
int negate(int x) {
  return ~x+1;
}
代码解释:取x的相反数,用0-x也就是0+x的补码,所以直接返回~x+1即可。
  • 函数10
要求
isPositive - return 1 if x > 0, return 0 otherwise 
 *   Example: isPositive(-1) = 0.
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 8
 *   Rating: 3
代码实现
int isPositive(int x) {
  return !(x>>31|(!x)); //符号位取反 
}
代码解释:如果x大于0则返回1,否则返回0,因此直接判断符号位,但需要特殊考虑0
  • 函数11
要求
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) {
  //分符号进行讨论,同号,异号 
  int x_f=(x>>31),y_f=(y>>31);//获得x,y的符号
  int judge1=(!((y+(~x)+1) >>31));//同号,y-x,看符号位
  int judge2=x_f&1; //异号,如果x>=0,说明 x>y
  int sign=x_f^y_f;
  return (!sign & judge1)|(sign &judge2);
}
代码解释:首先对x,y进行符号位的判断,如果x,y异号的话,x>=0,则说明x>y,返回0,如果x,y同号直接进行相减判断符号即可。
  • 函数12
要求
ilog2 - return floor(log base 2 of x), where x > 0
 *   Example: ilog2(16) = 4
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 90
 *   Rating: 4
代码实现
int ilog2(int x) {
  int bitsNumber=0;
    bitsNumber=(!!(x>>16))<<4;//确定a 
    bitsNumber=bitsNumber+((!!(x>>(bitsNumber+8)))<<3);//确定b 
    bitsNumber=bitsNumber+((!!(x>>(bitsNumber+4)))<<2);//确定c 
    bitsNumber=bitsNumber+((!!(x>>(bitsNumber+2)))<<1);//确定d 
    bitsNumber=bitsNumber+(!!(x>>(bitsNumber+1)));//确定e 
    return bitsNumber;
}
代码解释:求log2(x),即判断多少位二进制表示。先将x右移16位i,若大于0,则先得到(10000)=16,否则得到0。 在现有数值的基础上依次相加。x在现有bitsNumber的基础上依次加842,相当于一个二分的过程, 每一步都是相同操作,即将x右移指定位数,由结果是否为0,决定bitsNumber继续加几。

以下开始处理浮点数,实现规则比整数要松一些,允许使用循环和条件控制也可以同时使用int和unsigned。可以使用任意整数和无符号常量。

  • 函数13
要求
float_neg - Return bit-level equivalent of expression -f for
 *   floating point argument f.
 *   Both the argument and result are passed as unsigned int's, but
 *   they are to be interpreted as the bit-level representations of
 *   single-precision floating point values.
 *   When argument is NaN, return argument.
 *   Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while
 *   Max ops: 10
 *   Rating: 2
 代码实现
 unsigned float_neg(unsigned uf) {
   if((uf & 0x7f800000)==0x7f800000 &&(uf !=0x7f800000)&& (uf!=0xff800000))
   {
       return uf;
   }
   else return uf^0x80000000;
}
代码解释:首先判断浮点数是否为nan,如果为nan则返回本身,否则返回-f。判断浮点数可以采用f和0x7f80000相与的结果来判断。
  • 函数14
要求
float_i2f - Return bit-level equivalent of expression (float) x
 *   Result is returned as unsigned int, but
 *   it is to be interpreted as the bit-level representation of a
 *   single-precision floating point values.
 *   Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while
 *   Max ops: 30
 *   Rating: 4
代码实现
unsigned float_i2f(int x) {
    unsigned shiftLeft=0;  
    unsigned afterShift, tmp, flag;  
    unsigned absX=x;  
    unsigned sign=0;  
    //special case  
    if (x==0) return 0;  
    //if x < 0, sign = 1000...,abs_x = -x  
    if (x<0)  
    {  
        sign=0x80000000;  
        absX=-x;  
    }  
    afterShift=absX;  
    //count shift_left and after_shift  
    while (1)  
   {  
        tmp=afterShift;  
        afterShift<<=1;  
        shiftLeft++;  
        if (tmp & 0x80000000) break;  
   }    
    if ((afterShift & 0x01ff)>0x0100)  
        flag=1;  
    else if ((afterShift & 0x03ff)==0x0300)  
        flag=1;  
    else  
        flag=0;  
    return sign + (afterShift>>9) + ((159-shiftLeft)<<23) + flag;  
}
代码解释:将整形转化为无符号浮点数,即求浮点数。先取的符号位,再将剩余部分全部取为正数形式,即absx,即可以得到无符号的数值。然后将有数字的部分直接移动到最高位,记录移动的位数,再将其移动9位(因尾数只要23即可)。对于阶码部分,由于记录的是小数点从31位右数到第一个1,但实际上需要处理的是从第0位到第一位,所以E=32-shiftleft,bias为127,加上为159if部分做舍入处理
  • 函数15
要求
float_twice - Return bit-level equivalent of expression 2*f for
 *   floating point argument f.
 *   Both the argument and result are passed as unsigned int's, but
 *   they are to be interpreted as the bit-level representation of
 *   single-precision floating point values.
 *   When argument is NaN, return argument
 *   Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while
 *   Max ops: 30
 *   Rating: 4
代码实现
unsigned float_twice(unsigned uf) {
   unsigned f=uf;  
        /* Computer 2*f. If f is a NaN, then return f. */  
    if ((f & 0x7F800000) == 0){  
        //shift one bit to left  
                f = ((f & 0x007FFFFF)<<1) | (0x80000000 & f);  
    }  
    else if ((f & 0x7F800000) != 0x7F800000){  
        /* Float has a special exponent. */  
        /* Increment exponent, effectively multiplying by 2. */  
        f =f+0x00800000;  
    }  
    return f;  
}
代码解释:将无符号浮点数乘2,对无阶码小数,对其尾部乘2即可,即直接左移一位,但要提前记录符号位。对于规格化数,直接对其阶码+1即可

(4).使用dlc编译器来检查解决方案是否符合编码规则,并用btest来测试编写程序的正确性。

实验结果及分析

(1).使用dlc检测bits.c是否有错误
在这里插入图片描述
结果显示没有错误,说明代码编写规范。
(2).使用dlc的-e选项检查各个操作数是否符合要求
在这里插入图片描述
(3).使用btest检验函数实现代码的功能正确性,先使用make编译生成btest可执行文件(这里用make,对当前目录下所有程序进行编译)
在这里插入图片描述
(4).调用btest命令检查bits.c中所有函数功能的正确性,以便下一步查找错误原因,执行./btest bits.c后结果如下:
在这里插入图片描述
这是经过调试之后的测试结果,所有功能得到验证。
(5).测试结束后或者每次用btest测试时,需使用make clean删除生成的可执行文件。
在这里插入图片描述
(6).测试btest其它功能
./btest:测试所有函数的正确性,并输出错误信息
./btest –h:打印出相关提示信息。
在这里插入图片描述
./btest –g :测试所有函数在不返回错误信息的紧凑型模式
在这里插入图片描述
./btest –f float_twice:测试某特定的函数
在这里插入图片描述
./ishow x; ./fshow y:显示整数和浮点数的位级表示。
在这里插入图片描述

收获和体会

(1).通过该实验进一步熟悉了整型及浮点数的位表达形式,实现常用二进制运算的常用方法。
(2).对基本的二进制运算的总结
按位与(&):参与运算的数字转换为二进制,而后逐位对应进行运算。
按位或(|):参与运算的数字转换为二进制,对应位相或。
异或(^): 参与运算的数字转换为二进制,对应位相异或,规则两位相同为0,不同为1。异或运算能够实现伟翻转,高效交换两个变量的值等功能。
按位非():将一个数按位取反,即0 = 1,~1 = 0。
逻辑非(!):将真值结果取反,如!5=0,!0=1。
(3).算术移位和逻辑移位的区别
左移:x<<y表示将x左移y位,左边的位全部丢弃,在右边全部补0。
右移:x>>y表示将x右移y位,右边的位全部丢弃,对于逻辑移位,左边补0,对于算术移位,左边填充符号位。
(4).实验过程中遇到不会做的题目,通过上网查阅资料,回顾课本知识点,体会到了C语言中使用二进制运算也可以实现很多功能,如两个数的大小比较,不用循环统计二进制数据中1的个数,获取某一字节等等,对相整数和浮点数的位级表示等相关知识也有一定的提升。

参考博客

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

计算机系统实验之datalab 的相关文章

  • Boom!!!计算机系统,从理解到爆炸,Bomblab

    进入目录下 bomb 开始运行炸弹 对于炸弹command not found之类的鬼畜情况 xff1a chmod 777 bomb 然后再运行炸弹 objdump d bomb gt bomb s 把整个代码打到文件里去 xff0c 也
  • 进程的互斥与同步

    一 进程 线程的背景 引入进程 为了描述和实现多个程序的并发执行 以改善资源利用率即提高系统的吞吐量 引入线程 减少程序并发执行时系统所付出的额外开销 使操作系统具有更好的并发性 二 进程的互斥与同步 注意 同步即协调 采用多道程序技术的操
  • 数据密集型应用系统设计(1)

    文章目录 可靠 可拓展可维护的应用系统 软件系统最重要的三个特征 可靠性 可扩展性 可维护性 小结 可靠 可拓展可维护的应用系统 软件系统最重要的三个特征 可靠性 即使发生了某些错误 系统也可继续正常工作 故障 faults 或者叫错误 与
  • I/O控制方式——通道控制方式

    一 定义 通道是一个独立于 CPU的专管输入 输出控制的处理机 它控制设备与内存直接进行数据交换 它有自己的通道指令 这些通道指令受CPU启动 并在操作结束时向CPU发中断信号 二 原理 2 1 通道控制方式的引入 通道控制方式与DMA控制
  • 了解链接是什么?

    链接是将各种代码和数据片段收集并且组合成为一个单一文件的过程 这个文件可以被加载到内存并且执行 链接可以执行于编译时 也就是在程序被加载器加载到内存并且执行 甚至在执行于运行的时候 也就是由应用程序来执行 在早期的计算机系统中 链接是手动执
  • 计算机的内存

    物理内存 内存是电脑的一个硬件组成部分 从单片机的组成我们可以看到 CPU 内存和输入输出接口 就组成一个完整的电脑 其他统统属于外设 内存是可以被CPU通过总线进行操作的 也就是与CPU之间有总线相连接的 电脑所有的输入输出 都是要从内存
  • 哈工大2018秋高级语言程序设计课程大作业

    Github文件下载地址哈工大2018秋高级语言程序设计课程 高级语言程序设计 实验大作业反思报告 实验大作业题目 智能趣味电子通讯录 类型 信息管理系统 学生姓名 郭茁宁 班 号 1837101 学 号 1183710109 所在院系 计
  • 计算机系统 实验四(课程实验LAB四)

    实验中需要的几个控制语句 u userid 使用这个语句是要确保不同的人使用不同的 ID 做题 并攻击不同的地址 h 用于打印这几个操作的内容 n 用于 Level4 关卡 s 用于提交你的解决方案到服务器中 1 根据makecookie生
  • 整数乘法运算

    在高级语言中 两个n位整数相乘得到的结果通常也是一个n位整数 即结果只取2n位乘积中的低n位 这导致乘法运算得到结果必须在范围 2n 1 lt x y lt 2n 1才不会溢出 假设为4位 进行52 0101 0101 0101 0101
  • (四)现代计算机系统的层次结构

    程序执行结果 不仅取决于算法 程序的编写 而且取决于语言处理系统 操作系统 ISA 微体系结构 不同计算机课程处于不同层次 必须将各层析关联起来解决问题 功能转换 上层是下层的抽象 下层时上层的实现 地位为上层提供支撑环境 计算机系统的不同
  • 【定点数运算】定点的乘法和加法

    目录 定点的介绍 定点的优势 定点数的乘法和加法 乘法 加法 定点的介绍 在之前的博客中介绍了定点数和浮点数 想要了解的可以前往以下链接 定点和浮点 定点数与浮点数的解释 定点的优势 使用定点表示有什么优势 为什么不简单地将所有值规范化为整
  • Window11下载安装jdk8-jdk11与环境变量的配置

    目录 1 下载jdk 1 1 jdk8下载链接 请点击网址 1 2 jdk11下载链接 请点击网址 2 安装jdk 3 配置环境变量 3 1 打开设置 3 2 点击系统信息 3 3 高级系统设置 3 4 点击环境变量 3 5 新建系统变量
  • L1,L2,L3 Cache缓存原理

    一 介绍 CPU缓存 Cache Memory 也被称为Cache 是存储器子系统的组成部分 存放着程序经常使用的指令和数据 从广义的角度上看 Cache是快设备为了缓解访问慢设备延时的预留的Buffer 从而可以在掩盖访问延时的同时 尽可
  • 计算机系统实验六:程序的链接

    参考教材 计算机系统基础 第二版 袁春风 机械工业出版社 参考慕课 计算机系统基础 四 编程与调试实践 https www icourse163 org learn NJU 1449521162 计算机系统实验导航 实验一 环境安装 htt
  • 计算机浮点数规格化表示

    说明 在IEEE标准中 浮点数在内存中的表示是将特定长度的连续字节的所有二进制位按特定长度划分为符号域 指数域和尾数域三个连续域 float float类型在内存中占用的位数为 1 8 23 32bits double 1 11 52 64
  • 计算机系统课程 笔记总结 CSAPP第五章 优化程序性能(5.1-5.14)

    GitHub计算机系统CSAPP课程资源 计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理 2 1 2 2 计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理 2 3 2 4 计算机系统课程 笔记总结 CSAPP第三章
  • 无符号数 有符号数 与 补码

    无符号数 有符号数 与 补码 本文是深入理解计算机系统这本书里面关于补码有符号数无符号数章节的一个摘要和读书报告 我个人认为这本书关于这一段的表述 要比绝大多数网上的博客甚至是国内教材要深入浅出的多 同时由于markdown的文档表示公式很
  • 计算机系统课程 笔记总结 CSAPP第七章 链接(7.1-7.13)

    GitHub计算机系统CSAPP课程资源 计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理 2 1 2 2 计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理 2 3 2 4 计算机系统课程 笔记总结 CSAPP第三章
  • 保护模式的分段

    一 分段的背景 在8086处理器诞生之前 内存寻址方式就是直接访问物理地址 8086处理器为了寻址1M的内存空间 把地址总线扩展到了20位 但是 一个尴尬的问题出现了 ALU的宽度只有16位 也就是说 ALU不能计算20位的地址 为了解决这
  • 计算机系统课程 笔记总结 CSAPP第四章 处理器体系结构(4.1-4.3)

    GitHub计算机系统CSAPP课程资源 计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理 2 1 2 2 计算机系统课程 笔记总结 CSAPP第二章 信息的表示和处理 2 3 2 4 计算机系统课程 笔记总结 CSAPP第三章

随机推荐

  • STM32——GPIO配置

    文章目录 一 GPIO八种模式 1 输入 2 输出 3 如何选择GPIO的模式 二 库函数GPIO配置 1 配置代码 2 参数设置 一 GPIO八种模式 GPIO的输入输出是对于STM32单片机来说的 以下仅为个人粗略笔记 内部电路分析可参
  • ImageIo 用法

    84 ImageIo 用法 ImageIO read 参数 可以是一个文件 一个io流 或者是一个url ImageIO write 方法 可以写入到一个文件中 也可以写到一个io流中 public static void main Str
  • 通俗易懂解释知识图谱(Knowledge Graph)

    1 前言 从一开始的Google搜索 到现在的聊天机器人 大数据风控 证券投资 智能医疗 自适应教育 推荐系统 无一不跟知识图谱相关 它在技术领域的热度也在逐年上升 本文以通俗易懂的方式来讲解知识图谱相关的知识 尤其对从零开始搭建知识图谱过
  • 11-TensorFlow 基于ResNet的轴承故障诊断

    1 数据集 数据是来自凯斯西储大学 CWRU 滚动轴承数据中心 官方网站数据下载地址 https csegroups case edu bearingdatacenter pages download data file CWRU滚动轴承数
  • 【Shell牛客刷题系列】SHELL27 nginx日志分析5-统计爬虫抓取404的次数

    该系列是基于牛客Shell题库 针对具体题目进行查漏补缺 学习相应的命令 刷题链接 牛客题霸 Shell篇 该系列文章都放到专栏下 专栏链接为 专栏 Shell 欢迎关注专栏 本文知识预告 本文首先复习了grep awk wc等命令的相关用
  • 计算一个数的二进制表示中有多少个1

    https zhidao baidu com question 1370480689655286419 html 计算机里的数字本来就是用二进制存的 所以计算过程也都是二进制计算 利用一些位运算的特性 可以很容易计算1的个数 有一个很有意思
  • Assets/Vuforia/Scripts/DefaultInitializationErrorHandler.cs(10,7): error CS0246: The type or namespa

    Assets Vuforia Scripts DefaultInitializationErrorHandler cs 10 7 error CS0246 The type or namespace name Vuforia could n
  • android系统如何自适应屏幕大小

    b 1 屏幕相关概念 b 1 1分辨率 是指屏幕上有横竖各有多少个像素 1 2屏幕尺寸 指的是手机实际的物理尺寸 比如常用的2 8英寸 3 2英寸 3 5英寸 3 7英寸 android将屏幕大小分为四个级别 small normal la
  • PCIe的发展过程

    PCIe 在原来的时候 我们的电脑并不像如今这样 有如此统一的接口与总线规范 那时想要给主板做拓展有很大的局限性 因为主板上的接口基本只能对应一个硬件设备 各大厂商之间的规范也各不相同 就是在这样的大环境下 ISA 诞生了 上世纪 80 年
  • VS编写简单的C\C++程序步骤

    VS编写简单的C C 程序步骤 一共分为两个模块 第一个模块新建项目 具体如图 1 选择文件 gt 已安装 gt Visual C gt 空项目 gt 修改项目名 gt 修改项目存储位置 gt 确定 第2个模块 新建源程序文件 具体流程如下
  • ElementUI按需引入各种组件

    ElementUI按需引入各种组件 一 首先按需引入前奏 安装element ui npm i element ui S 安装按需引入必要插件 npm install babel plugin component D 修改 babelrc
  • linux下如何安装python以及一些注意事项

    linux下如何安装python 事先需找到python的下载路径 自己下载下来或者通过wget下载下来 官网包下载路径 https www python org downloads 1 安装python3 6 13 wget https
  • Spring系列之primary可以解决什么问题?

    存在的问题以及解决方案 直接上案例 通过案例来看技术是如何使用的 package com javacode2018 lesson001 demo8 public class NormalBean public interface IServ
  • Python基础知识之4

    Python基础知识之4 函数与库 所谓函数 就是把具有独立功能的代码块组织为一个小模块 在需要的时候可以反复调用 函数分为编译器自带的函数 内建 和用户自己创建的函数 自定义函数 内建函数是编译器开发者已经定义好的函数 用户可以直接使用
  • Sharding-JDBC(六)5.1.0版本,实现按月分表、自动建表、自动刷新节点

    目录 1 Maven 依赖 2 创建表结构 3 yml 配置 4 TimeShardingAlgorithm java 分片算法类 5 ShardingAlgorithmTool java 分片工具类 6 ShardingTablesLoa
  • Home_istoreOS

    1 重置网络 修改lan口 vi etc config network 修改LAN口为 192 168 10 100 修改root密码 原始密码password2 修改为旁路由模式 只需要修改网关为 192 168 10 1 不需要DHCP
  • 解决安装依赖时报错:npm ERR! code ERESOLVE

    系列文章目录 文章目录 系列文章目录 前言 一 错误原因 二 解决方法 三 注意事项 总结 前言 在使用 npm 安装项目依赖时 有时会遇到错误信息 npm ERR code ERESOLVE 该错误通常发生在依赖版本冲突或者依赖解析问题时
  • git解决 error: you need to resolve your current index first

    问题 执行切换代码分支 git checkout featrue 2019 06 24 报错如下 error you need to resolve your current index first 执行git pull代码时报错 Pull
  • styled-components:一本通

    初体验 styled方法 将React组件包装成Styled组件 的三种情况 tagged template literal interpolations 插值表达式 mixin StyledComponent相关特性 extend 继承
  • 计算机系统实验之datalab

    datalab实验是CSAPP中关于整数和浮点数的位运算的实验 对于我们理解位运算和整数 浮点数的位级表示有着很好的帮助 实验目的 修改bits c的C语言代码 使其通过所有在不违反任何编码准则的情况下 在btest中进行测试 进一步熟悉整