• 位运算


    0x3F 3F 3F 3F 有两个特性

    1、整数的两倍不超过 0x7F FF FF FF,即 int 能表示的最大正整数.

    2、整数的每 8 位(每个字节)都是相同的。

    需要考虑溢出的问题,以防止超过整数所能表示的最大范围,在表达式中,是按照最高的数据类型来保持中间变量的,与最后保存的变量数据类型无关。

    一、 计算  (a ^ b) mod p (快速幂)

    1 int power (int a, int b, int p) {
    2   int ans = 1 % p;
    3   while (b) {
    4     if (b & 1) ans = (ans * a) % p;
    5     a = (a * a) % p;
    6     b >>= 1;
    7   }
    8   return ans;
    9 }
    View Code

    二、计算 (a * b) mod p

    方法一:b 用二进制表示.和快速幂的类似。

    1 int mul_1 (int a, int b, int p) {
    2   int ans =  0;
    3   while (b) {
    4     if (b & 1) ans = (ans + a) % p;
    5     a = (a * 2) % p;
    6     b >>= 1; 
    7   }
    8   return ans;
    9 }
    View Code

    方法二: (a * b) mod p = (a * b) - (a * b / p) * p

    1 int mul_2 (int a, int b, int p) {
    2   a = a % p; 
    3   b = b % p;
    4   int c = a * b / p;
    5   int ans = a * b - c * p;
    6   if (ans < 0) ans += p;
    7   else if (ans >= p) ans -= p;
    8   return ans;
    9 }
    View Code

    二进制状态压缩

    是将一个长度为 m 的 bool 数组用一个 m 位的二进制整数表示并存储。例如 STL 中的 bitset.

    1、取出整数 n 在二进制表示下的第 k 位             (n >> k) & 1

    2、取出整数 n 在二进制表示下的第 0 ~ k-1 位      (n) & ((1 << k ) - 1)

    3、把整数 n 在二进制的表示下的第 k  位取反                  n  xor (1 << k)

    4、把整数 n 在二进制表示下的第 k 位赋值 1                   n | (1 << k)

    5、把整数 n  在二进制表示下的第 k 位赋值 0                  n & (~(1 << k))

    if (n % 2 == 0) n xor 1  = n + 1

    else n xor 1 = n - 1

    lowbit()运算

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

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

  • 相关阅读:
    【flutter学习】基础知识(一)
    【软件测试学习】 敏捷开发(二)
    【软件测试学习】 软件测试初步认识(一)
    【hugo】- hugo 监听浏览器切换title
    【hugo】- hugo 博客 添加鼠标单击特效
    春风十里
    一眼就能看懂的C#委托、多播委托和事件的区别与联系。
    js控制的DataGrid的URL参数不能动态刷新表格的问题
    [报错解决].net web api测试页面ajax 报错400 的问题
    [MVC]使用jquery.form.js 异步上传文件
  • 原文地址:https://www.cnblogs.com/gznb/p/11219752.html
Copyright © 2020-2023  润新知