• 正经学C#_位移与其位移运算符[c#入门经典]


    在c#入门经典一书中,最为糟糕的一节就是位移了,完全没有讲明白,也没有说全,似乎只是轻轻点了一下何为位移,带了两次原码和补码,完全不理会是否明白不明白。这一点这本书很差。因为此书说了,在大多数应用开发中,除了数学应用,这个功能不是很好常用。 

    位移,是对操作数的二进制进行操作,计算中,二进制是以补码方式计算

    何为 原码,补码。

    原码:数字的二进制

    补码,计算机系统中数值的存储方式,二进制的特殊计算方式,也就是正数的负数形式,负数均已补码形式存储。计算过程:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外,末尾+1,按照二进制计算方式计算

    反码:计算机系统中数值的存储方式,二进制的特殊计算方式。计算过程:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

    原码和补码,反码是存在关系的,三者之间是可以互相转换。

    原码变补码,原码变反码

    正数:正数的原码和补码,反码是一样。

    9的二进制:1001 原码0000 1001 补码0000 1001,反码0000 1001

    负数 :

    原码:就是二进制,最高位位1。

    补码:过程最高位1表示符号,其他位按位取反,1变成0,0变成1。最后整个数加1.

    反码:除了最高位表述符号,1位负数【-】,0为正数【+】,之外每一位按位取反,1变成0,0变成1

    -9 原码0000 1001(上面说过,负数的二进制,均已正数的二进制的补码出现,-9的正数也就是9,二进制原码也就是9的二进制),补码1111 0111, 反码1111 0110

    补码的过程:先是最高位表示符号【1是负数,0是正数】,其他位按位取反,1变成0,0变成1也就是: 1111 0110,之后整个数字+1,

    1111 0110+1=1111 0111就ok了

    反码的过程:先是最高位表示符号【1是负数,0是正数】,其他位按位取反,1变成0,0变成1也就是: 1111 0110 也就ok了,【补码和反码之间的关系是,反码的末尾+1】

    补码,反码求原码

    正数:

    正数的原码,补码,反码是一样的,一样的!

    2:原码0000 0010,反码:0000 0010,补码0000 0010

    负数:

    补码求原码:除了最高位表示符号不变之外,其他位按位取反,1变0,0变1,最后+1【按二进制计算方法计算】

    反码求原码:除了最高位表示符号不变之外,其他位按位取反

    -2 补码 1111 1110 反码1111 1101 原码0000 0010【正数的2,因为计算机的负数均已正数的二进制的补码形式存储或者变现,负数的原码也即是此负数的去符号的数】

    ok了,搞明白什么是原码,补码,反码,咱就看看  位移运算符

     下表列出了 C# 支持的位运算符。假设变量 A 的值为 60,变量 B 的值为 13,则:

    运算符名字描述实例
    & 位逻辑运算 如果同时存在于两个操作数中,二进制 AND 运算符复制一位到结果中。 (A & B) 将得到 12,即为 0000 1100
    | 位逻辑运算 如果存在于任一操作数中,二进制 OR 运算符复制一位到结果中。 (A | B) 将得到 61,即为 0011 1101
    ^ 位逻辑异或运算 如果存在于其中一个操作数中但不同时存在于两个操作数中,二进制异或运算符复制一位到结果中。 (A ^ B) 将得到 49,即为 0011 0001
    ~ 位逻辑运算 二进制补码运算符是一元运算符,具有"翻转"位效果,即0变成1,1变成0。 (~A ) 将得到 -61,即为 1100 0011,一个有符号二进制数的补码形式。
    <<   二进制左移运算符。左操作数的值向左移动右操作数指定的位数。 A << 2 将得到 240,即为 1111 0000
    >>   二进制右移运算符。左操作数的值向右移动右操作数指定的位数。 A >> 2 将得到 15,即为 0000 1111
    <<=   左移且赋值运算符 A <<= 2 等同于 A = A << 2
    >>=   右移且赋值运算符 A >>= 2 等同于 A = A >> 2
    &=   按位与且赋值运算符 A &= 2 等同于 A= A & 2 
    ^=   按位异或且赋值运算符 A ^= 2 等同于 A = A ^ 2
    |=   按位或且赋值运算符 A |= 2 等同于 A = A | 2

      解释一下较为理解苦难的地方 

    下面这个列表,是对运算符按照位运算的方式,建议配合下面的解释阅读
    ABA& BA | BA ^ B
    0 0 0 0 0
    0 1 0 1 1
    1 1 1 1 0
    1 0 0 1 1
    1、位逻辑与运算
    位逻辑与运算将两个运算对象按位进行与运算。与运算的规则:1与1等于1,1与0等于0,0与0等于0。
    比如:1001 0001(二进制)&1111 0000等于1001 0000(二进制)。
     
    2位逻辑或运算
    位逻辑或运算将两个运算对象按位进行或运算。或运算的规则是:1或1等1,1或0等于1,
    0或0等于0。比如1001 0001(二进制)| 1111 0000(二进制)等于1111 0001(二进制)。
     
    3、位逻辑异或运算
    位逻辑异或运算将两个运算对象按位进行异或运算。异或运算的规则是:1异或1等于0,
    1异或0等于1,0异或0等于0。即:相同得0,相异得1。
    比如:1001 0001(二进制)^1111 0000(二进制)等于0110 0001(二进制)。
     
    4、位逻辑非运算
    位逻辑非运算是单目的,只有一个运算对象。位逻辑非运算按位对运算对象的值进行非运算,即:如果某一位等于0,就将其转变为1;如果某一位等于1,就将其转变为0。
    比如,对二进制的1001 0001进行位逻辑非运算,结果等于0110 1110,用十进制表示就是:
    ~145等于110;对二进制的01010101进行位逻辑非运算,结果等于10101010。用十进制表示就是~85等于176。
     
    剩下就是 左移 右移 【<<】【>>】
     
                               A=10 二进制:0000 1010 
    运算符   结果
    << 二进制左移运算符。左操作数的值向左移动右操作数指定的位数。 A << 2 将得到 40,即为 0010 1000
    >> 二进制右移运算符。左操作数的值向右移动右操作数指定的位数。 A >> 2 将得到 2,即为 0000 0010

    位移,是对操作数的二进制进行操作,计算中,二进制是以补码方式计算

    左移运算符:<<  格式 X<<N, X的类型只能是int,uint、long或ulong,N的类型只能是int,N的类型只能是int,或者显示转换为这些类型之一,否则变异程序时会出现错误。

    列子:

    20 二进制 0000 0000 0000 0000 0000 0000 0001 0100【操作类型默认为int ,int是32位,所以二进制也是32】

    20<<3 也就是 0000 0000 0000 0000 0000 0000 1010 0000 ,十进制等于160

    -10二进制 1111 1111 1111 1111 1111 1111 1111  0110【负数均已正数的补码形式存储或者表示】

    -10 <<5  : 1111 1111 1111 1111 1111 1110 1100 0000 转换成十进制 -320

    也就是右移运算符:>> 格式X>>N, X的类型只能是int,uint、long或ulong,N的类型只能是int,N的类型只能是int,或者显示转换为这些类型之一,否则变异程序时会出现错误。

    列子:

    正数

    54 二进制:0000 0000 0000 0000 0000 0000 0011 0110

    54>>4 0000 0000 0000 0000 0000 0000 0000 0011  十进制 3

    负数

    -24 补码 1111 1111 1111 1111 1111 1111  1110 1000 

    -24>>2 1111 1111 1111 1111 1111 1111 1111 1010 十进制-6

    ok

  • 相关阅读:
    一篇关于兼容问题的基础总结
    js数组遍历some,foreach,map,filter,every对比
    webpack笔记1
    前段集成解决方案grunt+yeoman初步认识
    简单的Linq笔记
    .net 使用Json(),maxJsonLength属性设置的值问题
    .net using使用小结
    根据某个字段的长度,且不包含”,“,作为条件查询
    JS Replace() 全部替换字符的用法
    SQL分页查询,纯Top方式和row_number()解析函数的使用及区别
  • 原文地址:https://www.cnblogs.com/T-ARF/p/6362479.html
Copyright © 2020-2023  润新知