网站编写语言什么好,企业推广文章,怎样建设微网站,做网页链接网站1.数字在计算机中的表示
原码、反码和补码都是计算机中用于表示有符号整数的方式。它们的使用旨在解决计算机硬件中的溢出和算术运算问题。 原码#xff08;Sign-Magnitude#xff09;#xff1a; 原码最简单#xff0c;它的表示方式是用最高位表示符号位#xff0c;0表示…1.数字在计算机中的表示
原码、反码和补码都是计算机中用于表示有符号整数的方式。它们的使用旨在解决计算机硬件中的溢出和算术运算问题。 原码Sign-Magnitude 原码最简单它的表示方式是用最高位表示符号位0表示正数1表示负数其余位表示数值的绝对值。例如5 的原码是 00000101-5 的原码是 10000101。 反码Ones Complement 反码表示方式在原码的基础上负数的表示方式稍作修改。对于正数反码与原码相同。对于负数反码是将原码中的1变成00变成1。例如5 的反码仍然是 00000101-5 的反码是 11111010。 补码Twos Complement 补码是计算机中最常用的表示方式。它也在原码的基础上稍作修改。对于正数补码与原码相同。对于负数补码是将原码中的1变成0然后在最低位加1。例如5 的补码仍然是 00000101-5 的补码是 11111011。
为什么需要反码和补码以及它们的优点 解决0的表示问题 在原码中0 和 -0 有不同的表示这可能引起混淆。而在反码和补码中0 和 -0 都有相同的表示。 简化加法运算 使用补码可以简化加法运算因为负数的补码加法可以与正数的加法一样进行而不需要额外的规则。 解决溢出问题 补码在进行加法和减法时能够自然地处理溢出。当结果超出表示范围时溢出的位会被丢弃而不会引发错误。
计算机是如何进行加减运算的 加法运算 在计算机中加法运算通常使用补码来执行。两个数相加首先将它们的补码相加然后检查是否有溢出。如果有溢出溢出的位将被丢弃。补码的加法可以简化为模运算其中模是2的n次方n 是数据类型的位数。结果可能会包含一个溢出标志位用于指示运算是否溢出。 减法运算 减法运算也使用补码来执行。将被减数的补码与减数的补码相加然后检查是否有溢出。同样结果可能会包含一个溢出标志位。这种方式使加法和减法可以使用相同的硬件电路来执行从而简化了计算机的设计。
原码、反码和补码是计算机中表示有符号整数的方式它们在解决符号、0表示和溢出问题方面各具优势。补码通常是最常用的表示方式因为它能够自然地处理加法和减法并且不需要特殊的规则。
2.位运算规则
位运算是计算机中用于操作二进制位的一组操作符。这些操作符允许您直接操纵数字的二进制表示通常用于执行一些特定的位级操作。以下是常见的位运算操作和规则
1与、或、异或、取反 按位与AND 使用 操作符执行按位与操作。将两个数字的每个位都与对应位置的位进行比较如果都为1则结果位为1否则为0。 5 3 1
// 5 的二进制表示101
// 3 的二进制表示011
// 按位与的结果001按位或OR 使用 | 操作符执行按位或操作。将两个数字的每个位都与对应位置的位进行比较如果至少有一个为1则结果位为1否则为0。 5 | 3 7
// 5 的二进制表示101
// 3 的二进制表示011
// 按位或的结果111按位异或XOR 使用 ^ 操作符执行按位异或操作。将两个数字的每个位都与对应位置的位进行比较如果两个位不同则结果位为1否则为0。 5 ^ 3 6
// 5 的二进制表示101
// 3 的二进制表示011
// 按位异或的结果110按位取反NOT 使用 ~ 操作符执行按位取反操作。将数字的每个位都翻转0 变为11 变为0。 ~5 -6 // 注意取反后可能是负数
// 5 的二进制表示101
// 按位取反的结果-110左移和右移) 使用 操作符执行左移操作将数字的二进制表示向左移动指定的位数右侧用0填充。使用 操作符执行右移操作将数字的二进制表示向右移动指定的位数左侧用符号位对于有符号数或0填充。 5 2 20
// 5 的二进制表示00000101
// 左移2位的结果00010100-5 1 -3
// -5 的二进制表示11111011
// 右移1位的结果111111012算术移位和逻辑移位
算术移位是一种将数字的二进制位向左或向右移动的操作但与逻辑移位不同它在向右移动时保留了符号位。对于正数算术右移将在左侧填充0而对于负数算术右移将在左侧填充1以保持负数的符号。
算术右移右侧填充0或1取决于数字的符号。算术左移左侧填充0。
例子 正数 5 的二进制表示 0000 0101 正数 5 的算术右移 1 位 0000 0010保留符号位0右侧填充0 负数 -5 的二进制表示 1111 1011 负数 -5 的算术右移 1 位 1111 1101保留符号位1右侧填充1 逻辑移位Logical Shift
逻辑移位是一种将数字的二进制位向左或向右移动的操作不考虑符号位。逻辑移位在向右或向左移动时都填充0。
逻辑右移右侧填充0。逻辑左移左侧填充0。
例子 正数 5 的二进制表示 0000 0101 正数 5 的逻辑右移 1 位 0000 0010 负数 -5 的二进制表示 1111 1011 负数 -5 的逻辑右移 1 位 0111 1101 总结
算术移位保留符号位并根据符号位进行填充因此用于数学运算如除法和乘法。逻辑移位不考虑符号位始终填充0通常用于位级操作和数据处理。
3位运算常用技巧 获取特定位的值 num 42 # 二进制101010
bit_2 (num 2) 1 # 获取第2位的值
print(bit_2) # 输出 1获取第n位的值使用右移和按位与操作 ((num n) 1)。这将把第n位的值提取出来0或1。 设置特定位的值 设置第n位为1使用按位或操作 num | (1 n)。 清零特定位 清零第n位使用按位与和取反操作 num ~(1 n)。 更新特定位的值 更新第n位的值为1或0首先清零第n位然后使用按位或操作设置新值。
这些技巧可以用于对二进制数据进行高效的位级操作例如对寄存器或标志位进行处理或者用于位图操作等。在实际编程中它们通常用于优化性能、节省内存或执行特定的位级任务。