-
2020-06-29 22:17:13
二进制移动
1、算术左移-逻辑左移
算术左移和逻辑左移一样都是右边补0:
比如: 00101011 算术左移一位:01010110 逻辑左移一位:01010110
对于二进制的数值来说左移n位等于原来的数值乘以2的n次方
比如:00011010十进制是26,左移两位后是01101000转成十进制是104恰好是26的4倍。
ps:这种倍数关系只适用于左移后被舍弃的高位不含1的情况,否则会溢出。
2、 算术右移,逻辑右移
逻辑右移很简单,只要将二进制数整体右移,左边补0即可
比如:10101101逻辑右移一位为01010110
算术右移符号位要一起移动,并且在左边补上符号位,也就是如果符号位是1就补1符号位是0就补0
比如:11100算术右移一位为11110(符号位1跟着一起移动并且左边补了1)
对于二进制的数值来说右移n位等于原来的数值除以2的n次方
比如10110100十进制是76(需要先将这个补码转换成原码之后再转换成十进制),右移两位后是11101101转成十进制是19恰好是76的4倍。
3、算数移动逻辑移动的意义
算术左移和算术右移主要用来进行有符号数的倍增、减半; 逻辑左移和逻辑右移主要用来进行无符号数的倍增、减半。
更多相关内容 -
将一个数的二进制位从左到右翻转。
2018-04-20 11:33:51要求:在32位机器上25这个值包含下列各位: 00000000000000000000000000011001 翻转后:(2550136832) 10011000000000000000000000000000 程序结果返回: 2550136832#include<stdio.h> #include&...要求:
在32位机器上25这个值包含下列各位:
00000000000000000000000000011001
翻转后:(2550136832)
10011000000000000000000000000000
程序结果返回:
2550136832#include<stdio.h> #include<stdlib.h> unsigned int reverse_bit(unsigned int value) //定义一个无符号的数 { int ret = 0; int i; for(i=0;i<32;i++) //这个数的二进制位的每一位都需要与1与 { int r=value & 0x01; //这个数与1与之后赋给r,就取出来了这个数二进制位的最后一位 ret |= r<<(32-i-1); // 把取出来的二进制位的最后一位向左移31位,下一位取出来的数向左移30位,以此类推,并且把每一次移动后的值加起来,就是最后翻转后的值。 value = value >> 1; //每次的数与1与了之后,它需要向右移再次与1与 } return ret; //将这个数返回 } int main() { int val= 0; printf("请输入一个数字:"); scanf("%d",&val); printf("将这个数字位反转后是:%u\n",reverse_bit(val)); system("pause"); return 0; }
-
二进制的左右移位运算
2017-01-16 20:35:51移位运算符:最重要的一点,虽然数字存贮在计算机内存...→移位运算符:符号位随着运算数的移动,当为正数的时候最高位补0,为负数的时候符号位补1,最高位的补位取决于编译器,较多的补1. int i = 1; i = i 也就移位运算符:最重要的一点,虽然数字存贮在计算机内存中是以2进制的补码形式,但是运用移位运算符时是对源码进行的。
←移位运算符:高位舍弃,低位补0(负数与正数的运算是一样的)
例:int a=-10,g. g=a<<4=-160 a:11010(2)→110100000=-160(10)
→移位运算符:符号位随着运算数的移动,当为正数的时候最高位补0,为负数的时候符号位补1,最高位的补位取决于编译器,较多的补1.
int i = 1;i = i << 2; //把i里的值左移2位也就是说,1的2进制是000...0001(这里1前面0的个数和int的位数有关,32位机器,gcc里有31个0),左移2位之后变成000... 0100,也就是10进制的4,所以说左移1位相当于乘以2,那么左移n位就是乘以2的n次方了( 有符号数不完全适用,因为左移有可能导致符号变化,下面解释原因)
需要注意的一个问题是int类型最左端的符号位和移位移出去的情况.我们知道,int是有符号的整形数,最左端的1位是符号位,即0正1负,那么移位的时候就会出现溢出,例如:int i = 0x40000000; //16进制的40000000,为2进制的01000000...0000i = i << 1;那么,i在左移1位之后就会变成0x80000000,也就是2进制的100000...0000,符号位被置1,其他位全是0,变成了int类型所能表示的最小值,32位的int这个值是-2147483648,溢出.如果再接着把i左移1位会出现什么情况呢?在C语言中采用了丢弃最高位的处理方法,丢弃了1之后,i的值变成了0.
左移里一个比较特殊的情况是当左移的位数超过该数值类型的最大位数时, 编译器会用左移的位数去模类型的最大位数,然后按余数进行移位,如:int i = 1, j = 0x80000000; //设int为32位i = i << 33; // 33 % 32 = 1 左移1位,i变成2j = j << 33; // 33 % 32 = 1 左移1位,j变成0,最高位被丢弃在用 gcc编译这段程序的时候 编译器会给出一个warning,说左移位数>=类型长度.那么实际上i,j移动的就是1位,也就是33%32后的余数.在gcc下是这个规则,别的编译器是不是都一样现在还不清楚.总之左移就是: 丢弃最高位,0补最低位再说右移,明白了左移的道理,那么右移就比较好理解了.右移的概念和左移相反,就是往右边挪动若干位,运算符是>>.右移对符号位的处理和左移不同,对于有符号整数来说,比如int类型,右移会保持符号位不变,例如:int i = 0x80000000;i = i >> 1; //i的值不会变成0x40000000,而会变成0xc0000000就是说,符号位向右移动后,正数的话补0,负数补1,也就是汇编语言中的算术右移.同样当移动的位数超过类型的长度时,会取余数,然后移动余数个位.负数10100110 >>5(假设 字长为8位),则得到的是 11111101总之,在C中,左移是逻辑/算术左移(两者完全相同),右移是算术右移,会保持符号位不变.实际应用中可以根据情况用左/右移做快速的乘/除运算,这样会比循环效率高很多.在很多系统程序中常要求在位(bit)一级进行运算或处理。C语言提供了 位运算的功能,这使得C语言也能像汇编语言一样用来编写系统程序。
(引用部分内容)。
-
8位有符号二进制数(总结自《码出高效》)
2021-07-18 19:06:328位二进制数的表示范围为[-127,127]; 反码:正数数值部分是数值本身,符号位为0;负数的数值部分是在正数表示的基础上对各个位取反,符号位位1。 8位二进制数的表示范围为[-127,127]; 补码:正数数值部分是数值...1、原码,反码,补码
概念
- 原码:符号位和数字实际值的结合。正数数值部分是数值本身,符号位为0;负数数值部分是数值本身,符号位为1。
8位二进制数的表示范围为[-127,127];
- 反码:正数数值部分是数值本身,符号位为0;负数的数值部分是在正数表示的基础上对各个位取反,符号位位1。
8位二进制数的表示范围为[-127,127];
- 补码:正数数值部分是数值本身,符号位为0;负数的数值部分是在正数表示的基础上对各个位取反后加1,符号位为1。
8位二进制数的表示范围为[-128,127];
问题
1、+0,-0的原码,反码,补码分别是什么?
+0,-0的原码,反码,补码 +0 -0 原码 0|0000000 1|0000000 反码 0|0000000 1|11111111 补码 0|0000000 0|0000000 正数的原码,反码,补码均为数值本身,由此+0的反码和补码都为其原码;
-0原码为1|0000000,其反码按规定为符号位不变,其余各位取反1|1111111,补码为反码+1,即10|0000000,发生溢出,舍弃溢出的1得到0|0000000。得到上述结果。
n位有符号二进制数数值范围公式
原码和反码-2^(n-1)-1~2^(n-1)-1
补码-2^(n-1)~2^(n-1)-1
2、位移运算
2.1、有符号位移运算
十进制的奇数转化为二进制数之后,在向右移的过程中,最右边的1将被直接抹去,说明向右移对于奇数并非完全相当于除以2。在左移<<和右移>>两种运算中,符号位均参与移动,除负数往右移动,高位补1之外,其他情况均在空位处补0。
表格中二进制数均为原码的补码,因为计算机中的二进制运算都使用补码进行 8/0|0001000 35/0|0100011 -35/1|1011101 右移一位 4/0|0000100 17/0|0010001 -18/1|1101110 右移两位 2/0|0000010 8/0|0001000 -9/1|1110111 左移一位 16/0|0010000 70/0|1000110 -70/1|0111001 左移两位 32/0|0100000 -12/1|0001100 114/0|1110010 2.2、无符号位移运算
无符号位移运算,符号表示为">>>"。该运算不存在向左移动的方式。当向右移动时,正负数高位均补零,正数向右移动的最小值为0,而负数不断向右移动的最小值为1。可自行论证。
位移运算仅作用于整形(32位)和长整形(64位)数上,假如在整形数上移动的位数是字长的整数倍,无论是否带符号位及移动方向,均为本身。因为移动的位数是一个mod32的结果,即35>>1和35>>33是一样的结果。如果为长整形,mod64,即35<<1和35<<65的结果是一样的。负数在无符号往右移动63位时,除最右边为1,左边均为0,达到最小值1,如果>>64,则为其原数值本身。
public class test { public static void main(String[] args) { int i=35; System.out.println(i>>1); System.out.println(i>>33); long j=35l; System.out.println(j<<1); System.out.println(j<<65); long k=-35l; System.out.println(k>>63); System.out.println(k>>64); } }
3、位运算
位运算包括按位取反(~)、按位与(&)、按位或(|)、按位异或(^)等运算。如下
public class test { public static void main(String[] args) { //java中二进制以0b或0B开头 //a和b为二进制数的00000001 int a=0b0001; int b=0B01; System.out.println(a&b); System.out.println(a|b); //按位异或可以理解为相同为0,相异为1 //即0^0=0,1^1=0,1^0=1 System.out.println(a^b); } }
按位与和逻辑与(&&)运算都可以作用于条件表达式,但是后者有短路功能,表达如下:
boolean a=true; boolean b=true; boolean c=(a=(1=2))&&(b=(1==2));
因为&&前边的条件表达式,即如上的红色代码部分结果为false,触发短路,直接退出,最后a的值为false,b的值为true。假如把&&修改为按位与&,则执行后a和b的值均为false。
同样的,按位或对应的逻辑或运算(||)也具有短路功能,如下:
boolean e=false; boolean f=false; boolean g=(e=(1=1)||(f=(1=1));
最后e的值为true,f的值为false。假如把||修改为按位或符号|,执行的结果为e和f都为true。
-
二进制右移问题
2020-01-08 21:27:05000…(31个0)1 这个二进制数右移24位变成 0000…(23个0)1(8个0),因为这个数右移一位变成1000…(31个0),最右边的1变到最左边。 还有注意一个问题:CPU可以直接控制自己的内存器,但是对于引脚等外部寄存器... -
计算机中的二进制小数
2021-07-26 00:17:49前言理解浮点数的第一步是考虑含有小数值的二进制数字十进制小数首先看一下十进制的小数的表示,举例十进制数:12.3412.34 === 1 * 101 + 2 * 100 + 3 * 10-1 + 4 * 10-2 === 12二进制小数类比十进制小数表示形式二... -
C语言 某数输出二进制的某位
2021-05-20 12:51:48如题:输入一个整数,截取它对应的二进制位中从右到左的第8-11位(最右边为第0位)。**输入格式要求:"%d" 提示信息:"请输入一个整数:"**输出格式要求:"它的从右开始的第11-8位为:\n" "%d "程序运行示例如下:请输入... -
为什么二进制左移一位相当于乘以2
2020-02-06 10:16:15左移一位是0001 0000 0110,最高位不能去掉的,仔细想一下,原理很简单的,就比如一个十进制的数,例如2,左移一位,后面补0,就是20,,相当于乘以10,二进制的左移相当于乘以2,右移相当于除以2 ... -
二进制位运算---左移右移
2019-11-11 22:03:47原码:一个整数按照绝对值的大小转化成二进制的数 反码:将二进制数按位取反 补码:反码加 1 以-14 举例 原码:14 即 00000000 00000000 00000000 00001110 反码: 11111111 11111111 11111111 1... -
详解计算机内部存储数据的形式---二进制数
2020-08-07 12:15:20详解计算机内部存储数据的形式—二进制数 前言 要想对程序的运行机制形成一个大致印象,就要了解信息(数据)在计算机内部是以怎样的形式来表现的,又是以怎样的方法进行运算的。在 C 和 Java 等高级语言编写的 程序... -
有符号数的二进制数右移
2019-02-22 19:16:50把一个二进制数右移N位,规则为: 除符号位外,全部右移N位, 如果数字是一个无符号数值,则用0填补最左边的N位, 如果数字是一个有符号数值,则用1填补最左边的N位, 也就是说如果数字原先是一个正数,则右移之后在... -
【2021-04-05】二进制中的原码反码补码与二进制数的左移右移
2021-04-05 16:37:22二进制中原码补码与左移右移 -
数据是用二进制数表示的
2021-05-22 06:50:108种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问...将二进制数的各数位的值和位权相乘后再相加, 即可转换成为十进制数.92二进制数00001111左移两位后, 会变成原数的几倍?4倍二进制数左移1位后会变成原... -
详解计算机内部存储数据的形式 二进制数
2021-03-16 22:44:02详解计算机内部存储数据的形式—二进制数 前言 要想对程序的运行机制形成一个大致印象,就要了解信息(数据)在计算机内部是以怎样的形式来...一、用二进制数表示计算机信息的原因 计算机内部是由 IC(集成电路( Int -
求一个数的最高的二进制位(java)
2020-04-29 18:13:34假设第i位为1,1~i-1位 为0,i+1~最后一位 为0或1,表示为x. 思路: 1)0000 0000 01xx xxxx 变成 0000 0000 0111 1111 2)用0000 0000 0111 1111 - 0000 0000 0011 1111,结果=0000 0000 0100 0000 ... -
二进制位运算 左移与右移
2019-08-03 20:11:59原码:一个整数按照绝对值的大小转化成二进制的数 反码:将二进制数按位取反 补码:反码加 1 以-14 举例 原码:14 即 00000000 00000000 00000000 00001110 反码: 11111111 11111111 11111111 11110001 补码... -
对二进制数 位的操作
2019-05-23 17:52:16题目:获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列 这里,我运用最笨或者说最直接的做法,用两个数组分别存储奇数位和偶数位,然后循环,若当前为第奇数次循环,将该最低位存入奇数数组,同理... -
javaScript——二进制位运算符
2019-01-22 10:54:40概述 二进制位运算符用于直接对二进制位进行计算,一共有7个... 二进制否运算符(not):符号为~,表示对一个二进制位取反。 异或运算符(xor):符号为^,表示若两个二进制位不相同,则结果为1,否则为0。 左移... -
二进制和位运算
2019-03-15 20:03:26所有编程语言都是一种人和计算机之间的翻译工具,人的数组语言翻译成二进制给计算机读取,然后把计算机的二进制数据翻译成人类的语言呈现出来。 16进制 16进制用于缩写(简写)2进制,将2进制从后向前 每4位数转换... -
获取二进制数中bit位的值示例(移位、与操作)
2021-08-19 15:29:09二进制是计算技术中广泛采用的一种数制。...它对整型参数的每一个二进制位进行布尔与操作,即两个对应的二进制位同时为1时,才等于1。 2、操作符“|” 定义:称为按位或运算符。它对整型参数的每一个二进制位进行 -
二进制位运算
2017-12-03 20:00:01一,位运算基础 位运算(包括与,或,取反,异或,左移,右移等)是程序设计中的一个重要的领域。尤其是安全和底层开发中,除了指针的频繁使用之外,位运算是另一个非常频繁使用的领域。 因此,在求职面试中,位... -
简单理解二进制的左移和右移(通俗易懂)
2020-08-11 09:48:02左移(<<) 符号表示 : << 简单理解:二进制左移几位就是后面加几个0,前面去掉几位 举例说明: 39左移两位 ...简单理解:和左移同理...左移一位相当于乘2,右移一位相当于除2(不完全等同),比除法快 ... -
二进制计算
2021-07-21 05:31:49虽然很早就接触了二进制,却一直没有正视这个问题,阅读《计算机科学导论》的时候,基本上是跳过了这一部分,总是以“这么基础的东西,反正工作中基本用不上”的理由给搪塞过去。最近正在阅读《编码》和《程序员的... -
2、二进制
2021-07-26 08:01:22IC是集成电路的简称,集成引脚电路只有0和5V使用二进制可以更好的控制电脑里面的电路位:位(bit,缩写为b)是存储器的最小单位,可以表示一位二进制数.字节:1字节(Byte,缩写为B)由8个位组成,即1Byte=8bit,是... -
二进制图文详解
2017-09-11 14:18:47将2进制数位每位向左移动,右侧填充0 拼接int d1 = 00000000 00000000 00000000 11101010 d2 = 00000000 00000000 00000000 01010001 d3 = 00000000 00000000 00000000 11010111 d4 = 00000000 00000000 ... -
计算机中二进制的移位运算
2019-02-21 14:04:19:左移 左移是将一个二进制操作数对象按指定的移动位数向左移,左边溢出的位数被丢弃,右边的空位用0补充。左移相当于乘以2的幂次。∫将一个运算对象的各二进制位,全部左移若干位(左边的二进制丢弃,右边补0) ... -
二进制和十进制的转换and位运算
2021-01-30 11:02:131.将二进制数转换成十进制 转换规则: 展开位权进行求和运算 100110 1x2^5+0x2^4+0x2^3+1x2^2+1x2^1+0x2^0 1x32+0x16+0x8+1x4+1x2+0x1 32+0+0+4+2+0 结果=38 2.将十进制转换为二进制 转换规则:除2取余直至运算结果... -
二进制的左右翻转。
2019-01-22 22:28:13这个函数的返回值value的二进制位模式从左到右翻转后的值。 在32位机器上25这个值包含下列各位: 00000000000000000000000000011001 翻转后:(2550136832) 10011000000000000000000000000000 程序结果返回:... -
二进制+位操作 总结
2018-08-13 11:48:31扒了几篇博文,都是一些不符合需求的,对于一个数学渣渣来说,说的太简洁是会要命的,自己总结一下我碰到过的二进制。 参考资料:https://jingyan.baidu.com/article/1612d5008ff5b7e20f1eee4c.html 位运算(位... -
【C语言】写一个宏实现将一个整数的二进制的奇数位和偶数位交换
2022-04-15 19:44:51将一个整数的二进制的奇数位和偶数位交换 #define _CRT_SECURE_NO_WARNINGS 1 // 1. 取出奇数或者偶数 按位与 0101010类似的数据 //...之后的数据 向左移动一位 就得到了偶数位 // (num&am...