作业信息
班级链接: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)
循环移位的实现
标签:右移,0000,运算,二进制,20221421,左移,二进制位,2022,2023 From: https://www.cnblogs.com/lmq221421/p/16926407.html