2022-2023-1 20221421 《计算机基础与程序设计》第十三周学习总结()

作业信息

班级链接:https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP作业要求:https://www.cnblogs.com/rocedu/p/9577842.html#WEEK13作业正文:2022-2023-1 20221312 《计算机基础与程序设计》第十三周学习总结 – 221421李旻奇 – 博客园 (cnblogs.com)

我们都知道计算机内部是以补码形式存放数值的。利用C语言可以实现对二进制位的操作,现在学到这里C语言程序设计与计算机科学概论串联起来了;

程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。运位算包括位逻辑运算和移位运算,位逻辑运算能够方便地设置或屏蔽内存中某个字节的一位或几位,也可以对两个数按位相加等;移位运算可以对内存中某个二进制数左移或右移几位等。

首先原则低位对齐,高位补零。

按位与的定义是:同一二进制位上的数字都是1的话,&的结果为1,否则为0.

利用它有几个比较有意思的用法比如屏蔽具体操作是:将原二进制数与上0就可以了。0的位数对应原二进制数的位数,对各位进行屏蔽,全部置0;

0000 1111 & 0000 0011=0000 0011;

而其次&1的话相当于实现了对二进制位的读取操作毕竟&1相当于不变;其实该方法是屏蔽和读取的结合,&0保证消除无用位,&1保证有用数据的完整性。总结:对于原二进制数来说,&0是屏蔽,&1是不变。

按位或定义:只要参与运算的双方其中有一个是1,结果就是1.同0才为0.

例如:1010 0000 | 0000 1111;

结果为 1010 1111;

总结:对于原二进制数来说,|0是不变,|1是置1;

按位异或:只要参与运算的双方互异,结果就为1,否则为0

可以通过上面的定义看到,一个数1的话就会0变成1,1变成0,而0则不对原数进行改变。所以根据此特性可以对特定位进行0 1 反转。

例如: 1100 1100 ^ 0000 1100

结果为 1100 0000.

同样的,如果对一个数进行^0,代表保留原值。

取反(~)

对一个二进制数进行取反。1变0,0变1;

唯一需要注意的一点是,~的优先级是逻辑运算符中最高的,必须优先计算。

左移<<

对运算符<<左边的运算量的每一位全部左移右边运算量表示的位数,右边空出的位补0。

左移<<的原则是高位舍弃,低位补零。

例:char a=0x21;

则a<<2的过程 0010 0001〈〈2 = 1000 0100;即 a<<2的值为0x84。

左移1位相当于该数乘以2,左移n位相当于该数乘以2n。

右移>>

运算规则:对运算符>>左边的运算量的每一位全部右移右边运算量表示的位数,右边低位被移出去舍弃掉,空出的高位补0还是补1,分两种情况:

(1)对无符号数进行右移时,空出的高位补0。这种右移称为逻辑右移。

(2)对带符号数进行右移时,空出的高位全部以符号位填补。即正数补0,负数补1。这种右移称为算术右移。

右移1位相当于除以2,同样,右移n位相当于除以2n。

除法运算转化成位运算 (在不产生溢出的情况下)

a / (2^n) 等价于 a>> n

取模运算转化成位运算 (在不产生溢出的情况下)

a % (2^n) 等价于 a & (2^n – 1)

循环移位的实现

————————

作业信息

班级链接:https://edu.cnblogs.com/campus/besti/2022-2023-1-CFAP作业要求:https://www.cnblogs.com/rocedu/p/9577842.html#WEEK13作业正文:2022-2023-1 20221312 《计算机基础与程序设计》第十三周学习总结 – 221421李旻奇 – 博客园 (cnblogs.com)

我们都知道计算机内部是以补码形式存放数值的。利用C语言可以实现对二进制位的操作,现在学到这里C语言程序设计与计算机科学概论串联起来了;

程序中的所有数在计算机内存中都是以二进制的形式储存的。位运算说穿了,就是直接对整数在内存中的二进制位进行操作。运位算包括位逻辑运算和移位运算,位逻辑运算能够方便地设置或屏蔽内存中某个字节的一位或几位,也可以对两个数按位相加等;移位运算可以对内存中某个二进制数左移或右移几位等。

首先原则低位对齐,高位补零。

按位与的定义是:同一二进制位上的数字都是1的话,&的结果为1,否则为0.

利用它有几个比较有意思的用法比如屏蔽具体操作是:将原二进制数与上0就可以了。0的位数对应原二进制数的位数,对各位进行屏蔽,全部置0;

0000 1111 & 0000 0011=0000 0011;

而其次&1的话相当于实现了对二进制位的读取操作毕竟&1相当于不变;其实该方法是屏蔽和读取的结合,&0保证消除无用位,&1保证有用数据的完整性。总结:对于原二进制数来说,&0是屏蔽,&1是不变。

按位或定义:只要参与运算的双方其中有一个是1,结果就是1.同0才为0.

例如:1010 0000 | 0000 1111;

结果为 1010 1111;

总结:对于原二进制数来说,|0是不变,|1是置1;

按位异或:只要参与运算的双方互异,结果就为1,否则为0

可以通过上面的定义看到,一个数1的话就会0变成1,1变成0,而0则不对原数进行改变。所以根据此特性可以对特定位进行0 1 反转。

例如: 1100 1100 ^ 0000 1100

结果为 1100 0000.

同样的,如果对一个数进行^0,代表保留原值。

取反(~)

对一个二进制数进行取反。1变0,0变1;

唯一需要注意的一点是,~的优先级是逻辑运算符中最高的,必须优先计算。

左移<<

对运算符<<左边的运算量的每一位全部左移右边运算量表示的位数,右边空出的位补0。

左移<<的原则是高位舍弃,低位补零。

例:char a=0x21;

则a<<2的过程 0010 0001〈〈2 = 1000 0100;即 a<<2的值为0x84。

左移1位相当于该数乘以2,左移n位相当于该数乘以2n。

右移>>

运算规则:对运算符>>左边的运算量的每一位全部右移右边运算量表示的位数,右边低位被移出去舍弃掉,空出的高位补0还是补1,分两种情况:

(1)对无符号数进行右移时,空出的高位补0。这种右移称为逻辑右移。

(2)对带符号数进行右移时,空出的高位全部以符号位填补。即正数补0,负数补1。这种右移称为算术右移。

右移1位相当于除以2,同样,右移n位相当于除以2n。

除法运算转化成位运算 (在不产生溢出的情况下)

a / (2^n) 等价于 a>> n

取模运算转化成位运算 (在不产生溢出的情况下)

a % (2^n) 等价于 a & (2^n – 1)

循环移位的实现