水滴保险官方网站,高端网站设计新感觉建站,北京市门户网站,如何自己动手做网站1、 左移运算符左移运算符1)它的通用格式如下所示#xff1a;value numnum 指定要移位值value 移动的位数。左移的规则只记住一点#xff1a;丢弃最高位#xff0c;0补最低位如果移动的位数超过了该类型的最大位数#xff0c;那么编译器会对移动的位数取模。如…1、 左移运算符左移运算符1)它的通用格式如下所示value numnum 指定要移位值value 移动的位数。左移的规则只记住一点丢弃最高位0补最低位如果移动的位数超过了该类型的最大位数那么编译器会对移动的位数取模。如对int型移动33位实际上只移动了3321位。2)运算规则按二进制形式把所有的数字向左移动对应的位数高位移出(舍弃)低位的空位补零。当左移的运算数是int 类型时每移动1位它的第31位就要被移出并且丢弃当左移的运算数是long 类型时每移动1位它的第63位就要被移出并且丢弃。当左移的运算数是byte 和short类型时将自动把这些类型扩大为 int 型。3)数学意义在数字没有溢出的前提下对于正数和负数左移一位都相当于乘以2的1次方左移n位就相当于乘以2的n次方4)计算过程例如3 2(3为int型)1)把3转换为二进制数字0000 0000 0000 0000 0000 0000 0000 00112)把该数字高位(左侧)的两个零移出其他的数字都朝左平移2位3)在低位(右侧)的两个空位补零。则得到的最终结果是0000 0000 0000 0000 0000 0000 0000 1100转换为十进制是12。移动的位数超过了该类型的最大位数如果移进高阶位(31或63位)那么该值将变为负值。2、 右移运算符右移运算符1)它的通用格式如下所示value numnum 指定要移位值value 移动的位数。右移的规则只记住一点符号位不变左边补上符号位2)运算规则按二进制形式把所有的数字向右移动对应的位数低位移出(舍弃)高位的空位补符号位即正数补零负数补1当右移的运算数是byte 和short类型时将自动把这些类型扩大为 int 型。例如如果要移走的值为负数每一次右移都在左边补1如果要移走的值为正数每一次右移都在左边补0这叫做符号位扩展(保留符号位)(sign extension )在进行右移操作时用来保持负数的符号。3)数学意义右移一位相当于除2右移n位相当于除以2的n次方。4)计算过程11 2(11为int型)1)11的二进制形式为0000 0000 0000 0000 0000 0000 0000 10112)把低位的最后两个数字移出因为该数字是正数所以在高位补零。3)最终结果是0000 0000 0000 0000 0000 0000 0000 0010。转换为十进制是2。35 2(35为int型)35转换为二进制0000 0000 0000 0000 0000 0000 0010 0011把低位的最后两个数字移出0000 0000 0000 0000 0000 0000 0000 1000转换为十进制 85)在右移时不保留符号的出来右移后的值与0x0f进行按位与运算这样可以舍弃任何的符号位扩展以便得到的值可以作为定义数组的下标从而得到对应数组元素代表的十六进制字符。总结对于带符号右移,若为负数,则在存储时首位表示符号位,其值为1,表示该值是负数的移位,在移位过程中,高位补1,若符号位是0,表示是正数,在移位过程中高位补零,两者的前提是符号位保持不变:对于负数的右移因为负数在内存中是以补码形式存在的所有首先根据负数的原码求出负数的补码(符号位不变其余位按照原码取反加1)然后保证符号位不变其余位向右移动到X位在移动的过程中高位补1.等移位完成以后然后保持符号位不变其余按位取反加1得到移位后所对应数的原码。即为所求。3、无符号右移无符号右移运算符它的通用格式如下所示value numnum 指定要移位值value 移动的位数。无符号右移的规则只记住一点忽略了符号位扩展0补最高位无符号右移规则和右移运算是一样的只是填充时不管左边的数字是正是负都用0来填充无符号右移运算只针对负数计算因为对于正数来说这种运算没有意义无符号右移运算符 只是对32位和64位的值有意义例题【单选】下面函数的输出结果是什么void func() {int k 1^(1 31 31);printf(%d\n, k);}答案-21算术左移31位变为-1281000 0000 0000 0000 0000 0000 0000 0000-128算术右移31 位变为-11111 1111 1111 1111 1111 1111 1111 1111-1与1抑或得-2发现了一个异或1的妙处 我们可以直观的发现如果是一个偶数^1,那么答案是偶数1.如果是一个奇数^1,那么答案是奇数-1