算法进阶指南之位运算

基本运算符

& 与
| 或
~ 非
xor 异或

补码

  1. 32位无符号整数 unsigned int

    全0表示0
    全一表示4294967295

  2. 32位无符号整数 int

    全0表示0
    全一表示-1
    发生算数溢出时对2^32取模,得负数

  3. 建议memset语句初始化数组,正无穷的值为0x3f

移位运算

  1. 左移

    在二进制表示下把数字同时向左移动,低位以0填充,高位越界后舍弃

  2. 算数右移

    在二进制表示下把数字同时向右移动,高位以符号位填充,低位越界后舍弃

    相当于向下取整,c++中除是向0取整

  3. 逻辑右移略

大数运算取模

将一个数用二进制表示,每次与一个二进制位运算并取模

取出整数n在二进制表示下的第k位(n >> k) & 1 //让第k个元素变成第一个元素
取出整数n在二进制表示下的第0 ~ k - 1位 n & ((1 << k) - 1) // 1 << k => 1000…,再减1,变成0111…
把整数n在二进制下的第k位取反 n ^ (1 << k)
对整数n在二进制表示下的第k位赋值1 n | (1 << k)
对整数n在二进制表示下的第k位赋值0 n | ~(1 << k)

成对变换

当n为偶数时, n^1 == n + 1;
当n为奇数时,n^1 == n - 1;

lowbit运算

lowbit(n)取出非负整数n在二进制表示下最低位1以及它后面0构成的数值

lowbit(n) = n & (~n + 1) = n & (-n) // n + (~n) == 1

posted @   chanxe  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!
点击右上角即可分享
微信分享提示