zoukankan      html  css  js  c++  java
  • 关于负数的左右位移运算

    先备知识:

    关于负数是如何在内存中是如何存储的?

    在计算机内存当中,负数一律按照补码的形式进行存储,例如现在有一个负数-10

    -10的二进制原码形式为

    [1000 1010]2 这个地方需要注意的是高位为符号位,即当这个数字是负数的时候高位为1,正数时高位为0,且符号为不计入数值当中,只能表示正负数的概念。

    当-10存入计算机当中的时候,内存中需要对负数的原码进行按位取反加一的操作,即进行求补码的操作;特别注意,符号位不参与变化

    [1111 0110]2

    当需要将负数从内存当中取出的时候,首先需要将补码转化成原码,转变规则为对当前的补码取反加一(其中符号为不参与变化),转变的原码为:

    [1000 1010]2

    负数左移位运算相关操作: 

    以-10举例首先进行左移2位运算(-10<<2):

    1)-10的补码形式为:

    [1111 0110]2

    2)向左移动2位,右端补0得到新的补码为:

    [1101 1000]2

    3)将当前补码从内存中取出,取出时需要将补码转化成原码形式:

    [1010 1000]2

    4)通过换算可得[2 8]16加上符号即为[-40]10

    负数右移位运算相关操作:

    仍然是以-10来举例,将-10右移2位(-10>>2):

    1)确定-10的补码形式为:

    [1111 0110]2

    2)向右移动2位,高位补符号位,说人话就是符号位是几就补几:

    [1111 1101]2

    3)转化为原码形式取出(取反加一,符号位为不动):

    [1000 0011]2

    4)计算出来的结果为[0 3]16加上符号得出[-3]10

    总结:

    左移运算一律在右端补0,右移运算一律在左端补符号数(负数符号位为1就补1,正数符号位为0就补0)

    特别注意的是:

    负数是不能在原码的基础上进行操作的,需要首先转化成补码才能进行移位运算,并且运算的结果并不是直接结果,还是需要将其转化为原码才能当做运算结果输出!

    其中不要忘记了加上负号!

    补: 

    特别注意溢出问题:负数移位溢出之后的值一律为-1,正数移位溢出之后的值一律为0

    有时间再补上溢出问题。

  • 相关阅读:
    curd_4
    curd_2
    Python Regex库的使用
    Python Assert 确认条件为真的工具
    Python Regex库的使用(2)
    Python lambda的用法
    Python 列表综合
    with ss(date,date2) (select * from sysdummy1) select * from ss
    延迟执行函数
    ObjectiveC 的基本数据类型、数字、字符串和集合等介绍
  • 原文地址:https://www.cnblogs.com/oldfish123/p/14941113.html
Copyright © 2011-2022 走看看