博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
15.03.28-有意思的位运算
阅读量:6630 次
发布时间:2019-06-25

本文共 1154 字,大约阅读时间需要 3 分钟。

位运算的几个运算符 |(或) &(与) ~(非) ^(异或) >>(右移) <<(左移)

1.两次异或为本身

(可用于加密,两数字互换)

 1001 ^ 1101 = 0100;0100 ^ 1101 = 1001;

2.移位运算的右移>>

一般机器支持两种右移:逻辑右移和算数右移。

逻辑右移在右边补0: x >> k  ==>  [0,...0,   xn-1,xn-2,...x0

算术右移在右边补最高位有效值(0或1,这个在有符号数据中比较有用): x >> k  ==>  [xn-1,...xn-1,   xn-1,xn-2,...xk

常用的(可理解为默认的)为算术右移。java中区别两种符号,用>>表算术右移,用>>>表逻辑右移

32位的有符号整数(c#里面是int类型),>>31,正数只能为0,负数只能为-1.(有意思的0和-1)

验证:0(正整数最高位为0) 1010.....,右移31位后,加上最前面的符号0,全部为0,则结果为0

1(负数的符号位)1010...,不论第一个1的后面31位是什么,右移31位时,算术右移补右边最高位有效值,也就是1,最终的二进制表达式为32个1,即十进制的-1.

3.-2 >> n = -1 (其中n>=1)

还是有意思的-1.

负数的二进制表达式 原码 ---> 反码 --->补码

-10的二进制表达式:

原码:10000000 00000000 00000000 00001010

反码:11111111 11111111 11111111 11110101

补码(在反码上+1): 11111111 11111111 11111111 11110110 = -10

计算机内,有三种表示有符号数的方法:原码,反码,补码。

原码:+11: 0000 1011  -11: 1000 1011(简单直观,但不能用于计算,加减乘除...)

反码:+11: 0000 1011  -11: 1111 0100(对于0的表示有两种+0(00000000)和-0(11111111),表达范围在-127~+127)

补码:+11: 0000 1011  -11: 1111 0101(0只有(0000000)一种,所以相较反码多了-128的取值,表达范围在-128~127。用的最普遍,可以用于加减乘除)

因此,-2的二进制表达式为:11111111 11111111 11111111 11111110。看到这里,有种恍然大悟的感觉吧。

4.位移超过了数据类型最高位?

譬如:32位正整数 100 >> 60 = ?

把60%32=28 ==> 100 >> 28

 

转载于:https://www.cnblogs.com/icyJ/p/4374302.html

你可能感兴趣的文章
怎样获取Web应用程序的路径
查看>>
xcode crash 查找 EXC_BAD_ACCESS 问题根源的方法
查看>>
使用java.util.concurrent.ThreadFactory来创建线程
查看>>
UNIX高级环境编程: 终端登录过程-远程登录-进程组-Session-Linux启动过程-dup与重定向-守护进程...
查看>>
中国大数据科技传播联盟在京成立
查看>>
xargs 命令
查看>>
awk——报告生成器
查看>>
oracle 体系结构
查看>>
Nginx+Keepalived搭建高可用负载均衡集群
查看>>
VS2015 正式版中为什么没有了函数前面引用提示了?
查看>>
windows 系统的安装和虚拟机共享文件夹
查看>>
arp协议的混乱引发的思考--一个实例
查看>>
Why Public Cloud is Not a Security Concern
查看>>
配置XenDesktop一例报错-序列不包含任何元素
查看>>
javascript理解数组和数字排序
查看>>
微软同步框架入门之五--使用WCF同步远程数据
查看>>
Last-Modified、If-Modified-Since 实现缓存和 OutputCache 的区别
查看>>
理解SQL代理错误日志
查看>>
Multipart Internet Mail Extensions (MIME)
查看>>
C# WinForm控件之Dock顺序调整
查看>>