左移运算符

2020-3-9刷题

和自甴很熟 提交于 2020-03-09 13:38:58
以下代码输出什么? B int a =1,b =32 ; printf("%d,%d",a<<b,1<<32); A 1,1 B 1,0 C 0,0 D 0,1 << 左移 用来将一个数的各二进制位全部左移N位,高位舍弃,低位补0。 >> 右移 将一个数的各二进制位右移N位,移到右端的低位被舍弃,对于无符号数,高位补0。 左移运算符(<<)将其左侧运算对象每一位的值向左移动其右侧运算对象指定的位数。 a的二进制值:0000 0001 b的二进制值:0010 0000 a<<b:a左移32位,得到结果1。 进行探索, 当a左移1位,printf("%d",a<<1); 打印结果是:2 当a左移2位,printf("%d",a<<2); 打印结果是:4 ...... 当a左移30位,printf("%d",a<<30); 打印结果是:1073741824 当a左移31位,printf("%d",a<<30); 打印结果是:-2147483648 当a左移32位,printf("%d",a<<30); 打印结果是:1 当a左移33位,printf("%d",a<<30); 打印结果是:2 当a左移34位,printf("%d",a<<30); 打印结果是:4 ...... 当a左移34位,printf("%d",a<<30); 打印结果是:4 ... 当a左移62位,printf("%d

二进制位移的略解带符号右移>>和不带符号右移>>>

谁说胖子不能爱 提交于 2020-03-07 02:12:37
移位操作: 关于数的移位,特别需要注意: 1、正数,三码(源码、反码、补码)相同,所以无论左移还是右移都是补0.(左移则表示放大2的N次方,右移表示缩小2的N次方) 2、负数的补码就需要注意,左移在右边补0,右移需要在左边补1 有一个很有趣的误区是,认为符号位保持不变,仅仅移动数据位,这是不对的,因为无论数据位还是符号位,都是二进制,在整体大迁移的过程中,符号位也是要跟随潮流的。只不过,为了保证右移后,和原来的符号数一样,因此,负数在右移时左边补 计算机表示数字正负不是用+ -加减号来表示,而是用最高位数字来表示,0表示正,1表示负 左移<<:向左移位,符号后面的数字是移了多少位,移的位用0补齐,例如2进制数01111111左移一位后变为11111110,移位是字节操作。 右移>>:向右移位,符号后面的数字是移了多少位,移的位用符号位补齐,例如01111111右移一位后变为00111111,而10000000右移一位后变成11000000,因为符号位是1。 右移 demo1 >>> -- - 右移运算符,它表示是将运算符左边的对象向右移动运算符右边指定的数, 并且在高位补 0. int a = 16 ; int b = 2 ; System . out . print ( a >>> b ) ; 结果是 : 4 >> -- - 带符号右移运算符,它表示将运算符左边的运算对象,

[c语言]左移和右移

僤鯓⒐⒋嵵緔 提交于 2020-03-01 11:41:40
左移和右移都是位运算的概念。我们知道计算机是基于二进制保存数据的,因此左移和右移的概念十分重要。 本文约定是32位的机器。 [左移] 丢弃最高位,0补最低位 左移是把一个数按照二进制每位向左移动若干位,在c语言中用运算符 << 表示。例如: int x = 1; x = x << 2; //把x的值左移2位 1对应的二进制数为000……0001(前面一共31个0),左移2位之后变成000……0100,在十进制下为4。所以看起来左移n位相当于乘以2的n次方。(有符号数不完全适用,因为左移有可能导致符号的变化,下面将给出解释) 需要注意的是,当左移结果超出数据类型所能表示的范围时,会出现溢出(产生数据丢失并造成结果错误)。我们知道,int是有符号的整型数,最高位是符号位,0表示正数,1表示负数。那么移位的时候就会出现溢出,例如: int x = 0x40000000; //16进制的40000000,为2进制的0100……0000 x = x << 1; 这时候,x左移1位之后变成0x80000000,也就是2进制的1000……0000,符号位被置为1,变成了int型变量所能表示的最小值(因为负数是用补码表示的,计算补码:取反后加1),这个值在十进制下为-2147483648,我们成为溢出。如果把这个x再继续左移1位,那么最高位被丢弃,最低位补0,x的值就变成了0

Java 位运算(转)

北城以北 提交于 2020-02-28 11:44:37
位移动运算符: <<表示左移, 左移一位表示原来的值乘2. 例如:3 <<2(3为int型) 1)把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 0011, 2)把该数字高位(左侧)的两个零移出,其他的数字都朝左平移2位, 3)在低位(右侧)的两个空位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 1100, 转换为十进制是12。 同理,>>表示右移. 右移一位表示除2. 位运算: 位运算符包括: 与(&)、非(~)、或(|)、异或(^)   &:当两边操作数的位同时为1时,结果为1,否则为0。如1100&1010=1000    | :当两边操作数的位有一边为1时,结果为1,否则为0。如1100|1010=1110    ~:0变1,1变0    ^:两边的位不同时,结果为1,否则为0.如1100^1010=0110 位运算与位移动运行符的一个场景: HashMap的功能是通过“键(key)”能够快速的找到“值”。下面我们分析下HashMap存数据的基本流程: 1、 当调用put(key,value)时,首先获取key的hashcode,int hash = key.hashCode(); 2、 再把hash通过一下运算得到一个int h. hash ^= (hash >>> 20) ^

C语言之移位操作

早过忘川 提交于 2020-02-17 06:01:40
C语言很多操作都是以字节为单位进行的,但有时为了节约空间,很多系统程序中要求在比特位级别进行运算处理。C语言一同提供了六种位运算的运算符,分别为&(按位与),|(按位或),~(按位取反),^(按位异或),<<(左移),>>(右移)。本次我们就进行移位操作的分析,看看在不同情况下移位操作的情形。 (1)变量为正数的情形 当变量为正数的时候,无论左移还是右移,移动溢出的位丢弃,剩下的位补的都是0。 1.当移位的位数大于,0,并且小于所定义的类型的位数(如变量为整型,那他移位的范围在0~32之间)(左移和右移) 按照正常的情况处理,即将变量的二进制位移动相应的位数,然后在空出来的位上补零即可。 2。当移位的位数大于0,并且超出了所定义类型的位数(左移和右移) 将所移动的位数除以32取得的余数即为移位的位数,按照步骤一执行。 (2)变量为负数的情形 1.右移正数位,且右移位数小于所定义类型的位数 负数的右移与正数的右移规则一样,唯一不同的是正数右移左边补得是0,而负数右移左边补的是1,即符号(传说中的符号移位)。由于是负数,在计算机中以补码存储,即二进制的原码取反加1.然后以移位规则进行移位。即将所求的的补码向右移动相应的位数,左边空出来的位都用1来补齐。然后将这个补码的结果还原成原码即为所求。 2.右移正数位,并且右移的位数大于所定义类型的位数

python核心编程:七分钟全面了解位运算

醉酒当歌 提交于 2020-02-03 04:05:44
位运算是我们在编程中常会遇到的操作,但仍然有很多开发者并不了解位运算,这就导致在遇到位运算时会“打退堂鼓”。实际上,位运算并没有那么复杂,只要我们了解其运算基础和运算符的运算规则,就能够掌握位运算的知识。接下来,我们一起学习位运算的相关知识 文章目录 位运算的基础 二进制 补码 按位与 按位取反 左移运算 右移运算 位运算的应用 判断数字奇偶 变量交换 取 x 的第 k 位 代替地板除 程序中的数在计算机内存中都是以二进制的形式存在的,位运算就是直接对整数在内存中对应的二进制位进行操作。 位运算的基础 我们常用的 3, 5 等数字是十进制表示,而位运算的基础是二进制。即人类采用十进制,机器采用的是二进制,要深入了解位运算,就需要了解十进制和二进制的转换方法和对应关系。 二进制 十进制转二进制时,采用“除 2 取余,逆序排列”法: 用 2 整除十进制数,得到商和余数; 再用 2 整除商,得到新的商和余数; 重复第 1 和第 2 步,直到商为 0; 将先得到的余数作为二进制数的高位,后得到的余数作为二进制数的低位,依次排序; 排序结果就是该十进制数的二进制表示。例如十进制数 101 转换为二进制数的计算过程如下: 逆序排列即二进制中的从高位到低位排序,得到 7 位二进制数为 1100101,如果要转换为 8 位二进制数,就需要在最高位补 0。即十进制数的 8 位二进制数为

C#位运算

ぃ、小莉子 提交于 2020-01-31 05:24:56
C#位运算 在C#中可以对整型运算对象按位进行逻辑运算。按位进行逻辑运算的意义是:依次取被运算对象的每个位,进行逻辑运算,每个位的逻辑运算结果是结果值的每个位。C#支持的位逻辑运算符如表2.9所示。 运算符号 意义 运算对象类型 运算结果类型 对象数 实例 ~ 位逻辑 非 运算 整型,字符型 整型 1 ~a & 位逻辑 与 运算 2 a & b | 位逻辑 或 运算 2 a | b ^ 位逻辑 异或 运算 2 a ^ b << 位 左移 运算 2 a<<4 >> 位 右移 运算 2 a>>2 1、 位逻辑非运算 位逻辑非运算是单目的,只有一个运算对象。位逻辑非运算按位对运算对象的值进行非运算,即:如果某一位等于0,就将其转变为1;如果某一位等于1,就将其转变为0。 比如,对二进制的10010001进行位逻辑非运算,结果等于01101110,用十进制表示就是: ~145等于110;对二进制的01010101进行位逻辑非运算,结果等于10101010。用十进制表示就是~85等于176。 2 、位逻辑与运算 位逻辑与运算将两个运算对象按位进行与运算。与运算的规则:1与1等于1,1与0等于0。 比如:10010001(二进制)&11110000等于10010000(二进制)。 3、 位逻辑或运算 位逻辑或运算将两个运算对象按位进行或运算。或运算的规则是:1或1等1,1或0等于1,

java学习第一天 回顾以前

China☆狼群 提交于 2020-01-01 02:06:23
1.1 常量: 基本数据类型常量 字符常量 整数常量的表现形式:一进制的形式来表示(二进制,八进制,十进制,十六进制) 生活中:十进制 (0-9) ,星期 ( 七进制 (0-6)) , 时间 ( 十二进制 (0-11), 二十四进制 (0-23)) 计算机是通过二进制来读取我们生活中的数据。 进制之间的转换: 十进制转为二进制: 将十进制除以 2 ,直到商为 0 ,将余数从下上连接起来就是二进制 10---->1010 二进制转十进制:将二进制的每一位乘以 2^n ,n 从 0 开始, n 每一次加一 , 在将结果相加。 1001 ---- 》 1*2^0 +0*2^1 +0*2^2+1*2^3 = 9 将二进制换位八进制: 方式一:二进制 ---> 十进制 ---> 八进制 方式二:一个八进制相当于三个二进制为,将二进制三位一分割,计算出来 010 100 101 = 245 将二进制换为十六进制 : (0-9)(a(10)-f(15)) 0000 1010 0101 = a5 1.2 变量: Java 数据类型分为两种: 1.基本数据类型 Byte (字节) 8 位( bit ) 2. 引用数据类型 String 字符串。 变量的声明方式: //1. 数据类型 变量名 //2. 数据类型 变量名 1 ,变量名 2... 数据类型: // 数据类型的转换 //1. 自动类型转换

Java运算符左移<< 、右移 >>

一曲冷凌霜 提交于 2019-12-28 03:42:20
Java运算符左移<< 、右移 >> 左右位移其实都是根据我们的数字转化为二进制来进行位移的具体的我会在下面为大家讲解 1.左移<< 就比如说我们在代码中创建一个Integer 类型的变量 先运用 Integer.toBinaryString()方法将其转化为二进制然后我们就能开始讲解这个左移位的运算符了 首先我写了以下代码 Integer i = 15 ; System . out . println ( "开始是" + i ) ; System . out . println ( "i转化为二进制是" + Integer . toBinaryString ( i ) ) ; System . out . println ( "**************i << 1*******************" ) ; System . out . println ( i << 1 ) ; System . out . println ( "i转化为二进制是" + Integer . toBinaryString ( i ) ) ; System . out . println ( "i << 1转化为二进制" + Integer . toBinaryString ( i << 1 ) ) ; System . out . println ( "**************i <<

什么是按位移位(位移)运算符以及它们如何工作?

痴心易碎 提交于 2019-12-09 14:29:58
我一直在尝试在业余时间学习C语言,其他语言(C#,Java等)具有相同的概念(通常是相同的运算符)...... 我想知道的是,在核心层面,位移( << , >> , >>> )做了什么,它有什么问题可以帮助解决,以及潜伏在弯道的东西? 换句话说,一个绝对的初学者指导比特移位的所有优点。 #1楼 假设我们有一个字节: 0110110 应用一个左移位器让我们: 1101100 最左边的零移出字节,并在字节的右端附加一个新的零。 这些位不会翻转; 他们被丢弃了。 这意味着如果您离开1101100然后右移它,您将无法获得相同的结果。 向左移动N相当于乘以2 N. 向右移动N(如果你使用 的是补码 )相当于除以2 N 并舍入为零。 如果您使用的是2的幂,则Bitshifting可以用于疯狂快速的乘法和除法。几乎所有低级图形例程都使用位移。 例如,回到过去,我们使用模式13h(320x200 256色)进行游戏。 在模式13h中,视频存储器按像素顺序布局。 这意味着计算像素的位置,您将使用以下数学: memoryOffset = (row * 320) + column 现在,回到那个时代,速度是至关重要的,所以我们将使用位移来进行此操作。 然而,320不是2的幂,所以为了解决这个问题,我们必须找出加在一起的两个幂是多少才能得到320: (row * 320) = (row * 256) +