关于左移和右移

一、文章来由

项目需要将一个int拆开成高16位和低15位存不同的id,形成一个新的id,所以~~~

二、算术移位和逻辑移位

算术移位—有符号数的倍增、减半;
逻辑移位—无符号数的倍增、减半.

比如一个有符号位的8位二进制数11001101,逻辑右移就不管符号位,如果移一位就变成01100110。算术右移要管符号位,右移一位变成10100110。

左移
逻辑左移=算数左移,右边统一添0。
右移
(1)逻辑右移,左边统一添0(无符号)
(2)算数右移,左边添加的数和符号有关(有符号)

e.g:1010101010,其中[]位是添加的数字
逻辑左移一位:010101010[0]
算数左移一位:010101010[0]
逻辑右移一位:[0]101010101
算数右移一位:[1]101010101

三、一个有说服力的例子

#include <stdlib.h>
#include <stdio.h>
#include <iostream>

using namespace std;

void showInBinary(int number) {

    char string[100];

    itoa(number, string, 2);
    printf("integer = %3d string = %s\n", number, string);
}

int main()
{
    int number = -5;
    cout<<"左移之前"<<endl;
    showInBinary(number);

    number = number<<29;

    cout<<"左移之后"<<endl;
    showInBinary(number);

    return 0;
}

运行结果:

可见是将 -5 左移 29 位后变成正数了~~~

同时这个又扯出来一个问题:什么负数左移1位变成正数?

请看下一篇文章~~~

时间: 2024-11-04 19:21:10

关于左移和右移的相关文章

CSS怎么将背景图左移/上移/右移10px

将背景图左移,对background定位属性使用比较熟悉的朋友应该很容易就可以做到,下面有个不错的示例,不会的朋友可以参考下   背影图片的左上角相对当前元素左上角的坐标. 右为X轴正半轴, 下为Y轴正半轴 当前元素左上角坐标为 0,0 默认图片的左上角正对当前元素的左上角 如果图片想向左移 10px; 复制代码 代码如下: background:url(images/hh.gif) no-repeat -10px 0;} 如果图片想向上移 10px; 复制代码 代码如下: background

C语言里的左移和右移运算

先说左移,左移就是把一个数的所有位都向左移动若干位,在C中用<<运算符.例如: 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类型最左端的

C#移位运算(左移和右移)

C#是用<<(左移) 和 >>(右移) 运算符是用来执行移位运算. 左移 (<<):将第一个操作数向左移动第二个操作数指定的位数,空出的位置补0.左移相当于乘. 左移一位相当于乘2;左移两位相当于乘4;左移三位相当于乘8. x<<1= x*2 x<<2= x*4 x<<3= x*8 x<<4= x*16 同理, 右移即相反: 右移 (>>):将第一个操作数向右移动第二个操作数所指定的位数,空出的位置补0.右移相

C语言位运算符:与、或、异或、取反、左移与右移详细介绍_C 语言

位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,short,int与long类型. C语言提供的位运算符列表:运算符 含义 描述& 按位与 如果两个相应的二进制位都为1,则该位的结果值为1,否则为0| 按位或 两个相应的二进制位中只要有一个为1,该位的结果值为1^ 按位异或 若参加运算的两个二进制位值相同则为0,否则为1~ 取反 ~是一元运算符,用来对一个二进制数按位取反,即将

C语言实现数组的循环左移,右移,翻转

数组结合指针可以实现很多有趣的功能,比如下面这个程序: 假设数组为 : 12345 如果左移一次即为:23451 ,依次类推 如果右移一次即为:51234 ,依次类推 翻转则为:54321 我们来实现下这个程序: #include <stdio.h> #include <stdlib.h> #include <string.h> #define NR(x) (sizeof(x)/sizeof(x[0])) //数组左移 int buffer_left_move(int

Java核心技术 卷Ⅰ 基础知识(原书第10版)

Java核心技术系列 Java核心技术 卷Ⅰ 基础知识 (原书第10版) Core Java Volume I-Fundamentals (10th Edition) [美] 凯S.霍斯特曼(Cay S. Horstmann) 著 周立新 陈 波 叶乃文 邝劲筠 杜永萍 译 图书在版编目(CIP)数据 Java核心技术 卷Ⅰ 基础知识(原书第10版) / (美)凯S. 霍斯特曼(Cay S. Horstmann)著:周立新等译. -北京:机械工业出版社,2016.8 (Java核心技术系列) 书

c++-求份C++运算器,需要基本云运算关系运算逻辑运算位运算进制转换功能

问题描述 求份C++运算器,需要基本云运算关系运算逻辑运算位运算进制转换功能 1基本运算功能 主要包括:加.减,乘.除.取余.自增.自减等. 2.关系运算功能 主要包括:大于.大等于.小于.小等于.等于.不等于. 3. 逻辑运算功能 主要包括:与.或.非. 4.位运算功能 主要包括:按位与.按位或.按位异或.按位取反.左移和右移. 5.进制转换功能 主要包括:包括十进制转其他进制.二进制转其他进制 解决方案 我这个别处找的代码,不是我写的.. 解决方案二: http://download.csd

让input有更好的体验

最近做了一个类似这样的功能,在移动端上,数字可增可减.其中,能改变数字的触发点有: "-"号 "+"号 点击数字区块,唤起数字键盘. 这里,我直接用input来实现这个数字区块. 1. type="number"还是"tel"? 对比一下两张图,就能很快知道结论. type="number"下(左侧为ios,右侧为Android): type="tel"下(左侧为ios,右侧为Andro

ARM指令寻址方式之: 数据处理指令的寻址方式

4.1  数据处理指令的寻址方式 4.1.1  数据处理指令的寻址方式概要 数据处理指令的基本语法格式如下. <opcode> {<cond>} {S} <Rd>,<Rn>,<shifter_operand> 其中<shifter_operand>有下面11种形式,如表4.1所示. 表4.1        <shifter_operand>的寻址方式   语    法 寻 址 方 式 1 #<immediate>