当前位置: 首页 > news >正文

位运算的基础知识

位移运算符

位移运算符有两种,左移运算符 << 和 右移运算符 >>

箭头指向哪,就是往哪移;

左移运算符 <<

将一个数的各二进制位全部左移若干位,右补0;高位左移后溢出,舍弃;

int a = 3<<2;

是将数字3左移2位。即00000011----->00001100;

a的结果就是12;

右移运算符 >>

将一个数的各二进制位全部右移若干位, 高位的空位补符号位,即正数补0,负数补1;低位右移后溢出,舍弃;

int b = 11 >> 2;

是将数字11右移2位,即00001011------>00000010;

b的结果就是2;

二进制

对于二进制的左移或者右移,那么就有一个很巧妙的用法了;

对1进行左移可以用来表示2的几次方;

int c =1<<2; // 2的2次方;00000001------>00000100;
int d =1<<4; // 2的4次方;00000001------>00010000;

运算符 |=、&=、^=

^=位异或

a^=b等价于a = a^b,其中^是位异或运算,即将a与b的对应位进行异或运算同为0或者同为1时,对应位结果为0;否则为1。

假设,a的值为二进制的1010,b的值为二进制的1100,那么a^b = 0110。

    int a = 5; // 0000 0101int b = 3; // 0000 0011a ^= b; // 0000 0110

|=

两个二进制对应位为0时该位为0,否则为1 。

   int a = 5; // 0000 0101int b = 3; // 0000 0011a |= b; // 0000 0111

&=

两个二进制对应位都为1时,结果为1,否则结果为都0。

    int a = 5; // 0000 0101int b = 3; // 0000 0011a &= b; // 0000 0001

秦九韶算法

将几个n进制的数转换成十进制

int get(string s,int b) //将b进制的数转化成十进制
{int res = 0;//秦九韶算法for(auto c: s)res = res * b +c-'0';return res;
}

以二进制为例

s = 10101;

b = 2;

位运算的两种常用操作

n的二进制表示中第k位是几(从个位算)

先把第k位移到最后一位 用右移 >>

看个位是几 n>>k & 1;

1的话是0000 0001

除了最后一位,前面全是0,所以可以看出来最后一位是什么

int main()
{int n=10;cout<<(n>>1&1);return 0;} 
//输出是1,因为10的二进制是1010,右移一位后变成101;
//&是  同为1才为1

位运算 —— 模板

求n的第k位数字: n >> k & 1
返回n的最后一位1:lowbit(n) = n & -n

lowbit 操作 ,树状数组的一种操作

lowbit(x) 返回x的最后一位1;

x=1010 lowbit(x) = 10;

x=101000 lowbit(x) = 1000;

int i = 3;
//3的二进制是11;
int t = i&-1;
//t = 1;
i -= t;
//i = 2;2的二进制是10;
t = i&-1;
//t = 2;
i -= t;

x& -x =x&(--x+1)

作用 : 统计x里面1的个数

//用lowbit函数统计x里面1的个数
int lowbit(int x)
{int ans;while(x){x-=x&-x;s++;}return ans;
}

若有收获,就点个赞吧!

http://www.xdnf.cn/news/810793.html

相关文章:

  • C++图像缩放(StretchBlt,StretchDIBits,双线性内插法)
  • 软件测试面试及笔试题
  • 【Dom4j】Dom4j完整教程详解
  • 盘点日本人最常用的50个网站
  • tp-link无线网卡linux下的驱动,Ubuntu14下安装无线网卡驱动(TP-LINK TL-WN823N)
  • Visual Studio2010 简体中文含MSDN版本下载地址
  • You-Get 就是这么强势!
  • android的m、mm、mmm编译命令的使用
  • 什么是公网、私网、内网、外网?
  • 使用FileZilla等软件搭建ftp服务器
  • android高级面试题(二)
  • 校园后勤设备保修维护管理系统
  • 递推算法题:令人费解的开关『拉灯』
  • 安卓开发中JDK、SDK、NDK、ADT、ANT等概念作用解释
  • linux命令行怎么结束进程,linux结束进程命令
  • 你必须弄懂的Intent Filter匹配规则
  • C#命令行编辑器csc.exe
  • 基于stm32物联网开发板(3)--SYN6288语音模块
  • 《恐怖丛林生存》肉搏攻略,解开星星系统之谜
  • 电脑提示错误代码0xc000007b该怎么解决,几种解决办法
  • 富贵论坛的来历和背景
  • fast无线路由器设置服务器,迅捷(FAST)FW300R无线路由器怎么设置
  • android开发之PreferenceScreen使用详解
  • 入门级 如何编写第一个网页
  • 理解一般指针和指向指针的指针
  • 黑客的入侵方式你知道几种?
  • cookie是什么?有什么用?cookie详解,一篇文章彻底搞懂cookie
  • Smtp/POP3邮箱服务器地址和端口总结(163/126/QQ)
  • ioctl用法详解
  • html alt 作用,什么是alt标签的作用,alt标签对SEO有哪些影响呢?