mydy.net
当前位置:首页 >> 负数无符号右移一位 >>

负数无符号右移一位

在英文状态下按住shift键,输入两个'>'就是右移,输入两个'

首先纠正一个错误哈..>>是带符号右移>>>才是无符号右移..带符号右移就是将那个数转为2进制然后在前面补0或1 如果是正数就补0 负数补1 例如11>>2,则是将数字11右移2位 计算过程:11的二进制形式为:00000000000000000000000000001011,然后把低位的最后两个数字移出,因为该数字是正数,所以在高位补零.则得到的最终结果是00000000000000000000000000000010.转换为十进制是2.其他的到网上一搜就有了..无符号右移与带符号右移的区别就是无符号始终补0

一个负数等于0减去正数. 又一个负数也等于0减去正数. 这两个负数相加.因为0+0等于0.所以就等于负号(正数+正数) 我们知道正数+正数还等于正数.所以正数前面加负号就是负数

因为在C语言标准中,只规定了无符号数的移位操作是采用逻辑移位(即左移、右移都是使用的逻辑左移和逻辑右移).而对于有符号数,其左移操作还是逻辑左移,但右移操作是采用逻辑右移还是算术右移就取决于机器了!(算术右移和逻辑右移的区别是:算术右移不右移符号位,即最高位,右移后前补0还是1取决于符号位的值;逻辑右移执行时将移动符号位,右移后前补0) 因此,一个程序如果使用了有符号数的右移位操作,它就是不可移植的了.

为什么要搞个>>>(无符号右移)?就是为了处理有符号数的右移.因为如果用>>进行右移时,对于有符号数,左边填充的是符号位(正数填充0负数填充1).而对于>>>,都是填充0.>>>就是为有符号数而生的,怎么可能不能用于有符号数呢?

不管是正数还是负数,右移1位时丢弃最右1位,复制原有符号位作为新的符号位.所以,对于正数x,x>>1=x/2 对于负数x,x>>1=(x-1)/2 所以,-1,右移还是-1.负数的右移1,符号位还是1.符号位原来的1也是右移1的.

有符号就带符号、没符号就补0.转成2进制,或者自己用筷子摆几下,就清楚了.借个别人写好的了右移System.out.println(-3>>1);结果是-2,为什么会是-2呢?下面我们来看一下.System.out.println(Integer.toHexString(-3));得到-3的16进制为

和C\C++中的>>一样,表示对数字的二进制值进行右移运算, 第一位是符号位负数的第一位是1正数的第一位是0, -26的二进制值就是1011010右移后就是0101101(45), 26的二进制值就是0011010右移后就是0001101(13),

举个例子 int a =7>>1 , 就是将7的二进制(111)向右移动一位,就是(011)就是3,所以int a=3;也可看成是除以二,如果左操作数是奇数就看做(a-1)÷2,是偶数就是 a÷2 右移位运算就是将左操作数的比特位向右移动第二个操作数指定的位数,在二进制中,首位是用来表示正负的,若右移运算符的第一个操作数是正数,就填充0,是负数就填充1;

这里的第一位就是指的符号位!负数的第一位是1,正数的第一位是0

网站首页 | 网站地图
All rights reserved Powered by www.mydy.net
copyright ©right 2010-2021。
内容来自网络,如有侵犯请联系客服。zhit325@qq.com