基本位运算

1、位基本操作符:

  与 &

  或 |

  非

  异或 ^

  移位 >>、<<

2、应用:

  1、判断一个数是不是4的次幂

    ( (x & (x - 1)) == 0 ) && ( (x & 0x55555555) == x)

    2、获取负数

    -x = (~x + 1)

  3、交换两个数

   int a, b;

   a = a ^ b;

   b = a ^ b;

   a = a ^ b;

  4、循环移位

   (a << k) | ( a >> (32 - k) )

  5:位运算实现加减乘除(ps:相对于硬件实现的+-*/效率低很多,放在此处仅仅练习位运算) 

#include <stdio.h>
#include <stdlib.h>
#include <sys/time.h>
/* a + b */
int sum(int a, int b)
{
    int t;
    while(b)
    {
        t = (a & b) << 1;
        a = a ^ b;
        b = t;
    }
    return a;
}
/* -a */
int neg(int a)
{
    return sum(~a, 1);
}
/* a - b */
int sub(int a, int b)
{
    return sum(a, neg(b));
}
/* 判断a是不是负数 */
int ispos(int a)
{
    if(a & (1 << 31) )
        return 0;
    return 1;
}
/* a * b */
int mul(int a, int b)
{
    int ans = 0;
    int flag = 0;
    if(!ispos(a))
    {
        a = neg(a);
        flag ^= 1;
    }
    if(!ispos(b))
    {
        b = neg(b);
        flag ^= 1;
    }
    while(b)
    {
        if(b & 1) ans = sum(ans, a);
        a = a << 1;
        b = b >> 1;
    }
    if(flag)
        ans = neg(ans);
    return ans;
}
/* a / b */
int Div(int a, int b)
{
    int ans = 0;
    int flag = 0;
    if(!ispos(a))
    {
        a = neg(a);
        flag ^= 1;
    }
    if(!ispos(b))
    {
        b = neg(b);
        flag ^= 1;
    }
    int i;
    for(i = 31; i >= 0; i = sub(i, 1))
    {
        if( (a >> i) >= b)
        {
            ans = sum(ans, 1 << i);
            a = sub(a, b << i);
        }
    }
    if(flag)
        ans = neg(ans);
    return ans;
}

int main()
{
    struct timeval stime, etime;
    int a, b;
    long long i, j, u, v;
    i = j = u = v = 0;
    gettimeofday(&stime, NULL);
    for(a = -1000; a <= 1000; ++a)
        for(b = -1000; b <= 1000; ++b)
    {
        i += sum(a, b);
        j += sub(a, b);
        u += mul(a, b);
        if(b != 0)
            v += Div(a, b);
    }
    gettimeofday(&etime, NULL);
    printf("%ld\n", etime.tv_sec * 1000 + etime.tv_usec / 1000 - stime.tv_sec * 1000 - stime.tv_usec / 1000);
    return 0;
}

  

 

时间: 2024-10-18 06:28:16

基本位运算的相关文章

位运算

位运算的实际应用场景 http://blog.csdn.net/zmazon/article/details/8262185

POJ 1781 In Danger Joseph环 位运算解法

Joseph环,这次模固定是2.假设不是固定模2,那么一般时间效率是O(n).可是这次由于固定模2,那么能够利用2的特殊性,把时间效率提高到O(1). 规律能够看下图: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQva2VuZGVuMjM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" > 具体具体解析请看大师Knuth的Concrete m

位运算总结&amp;拾遗

JavaScript 位运算总结&拾遗 最近补充了一些位运算的知识,深感位运算的博大精深,此文作为这个系列的总结篇,在此回顾下所学的位运算知识和应用,同时也补充下前文中没有提到的一些位运算知识. 把一个数变为大于等于该数的最小的2的幂 一个数为2的幂,那么该数的二进制码只有最高位是1. 根据这个性质,我们来举个栗子,比如有数字10,转为二进制码后为: 1 0 1 0 我们只需把 0 bit的位置全部用1填充,然后再把该二进制码加1就ok了.而x | (x + 1)正好可以把最右边的0置为1,可是

Java I/O : Bit Operation 位运算

Writer      :BYSocket(泥沙砖瓦浆木匠) 微         博:BYSocket 豆         瓣:BYSocket FaceBook:BYSocket Twitter    :BYSocket 泥瓦匠喜欢Java,文章总是扯扯Java. I/O 基础,就是二进制,也就是Bit. 一.Bit与二进制 什么是Bit(位)呢?位是CPU处理或者数据存储最小的单元.类似于很小很小的开关,一开一关,表示为1或者0.所以,这就是计算机处理任何数据的"细胞",要谨记.

mysql位运算

1.MOD(X1,X2) 求余运算,返回余数同"%" 2.X1 DIV X2 除法运算返回商,同"/" 3.如果除数为0,那么结果为NULL. 4.<=>和= 是一样的,也是用来判断操作数是否相等的.不同的是<=>可以用来判断null,=不能判断null. 例:select null<=>null 结果1 逻辑运算符 1.与&&或and:所有操作数不为0且不为null时,结果为1,任何一操作数为0,结果为0,存在一

位运算之 C 与或非异或

位运算比较易混: 位运算之 C 与或非异或 与运算:& 两者都为1为1,否则为0 1&1=1,  1&0=0,  0&1=0,  0&0=0 或运算:| 两者都为0为0,否则为1 1|1 = 1,  1|0 = 1,  0|1 = 1, 0|0 = 0 非运算:~ 1取0,0取1 ~1 = 0, ~0 = 1 ~(10001) = 01110 异或运算:^ 两者相等为0,不等为1(易混淆) 1^1=0, 1^0=1, 0^1=1, 0^0=0 位移操作符:<&

Java的位运算

左移位操作 左移位运算的符号为[<<],左移位运算符左面的操作元称作被移位数,右面的操作数称作移位量. 左移位运算是双目运算符,操作元必须是整型类型的数据,其移动过程是:[a << n]运算的过程是通过将a的所有位都左移n位,每左移一个位,左边的最高位上的0或1被移出丢弃,并用0填充右边的低位 注意: 如果a是byte.short或int型数据,总是先计算出n%32的结果m,然后进行a<<m运算 对于long型数据,总是先计算出n%64的结果m,然后进行a <&l

常见的位运算

位运算主要有:|   &   ^    ~ & 这个是只要有0,则0 | 这个只要有1,则1 ^异或运算,只要不同则为1 ~全部相反 参与位运算首先要将数值化作为二进制补码,方可参与运算 >>                                               >>>                                << 有符号右移                                无符号右移   

C位运算笔记(根据网上内容整理)1

什么是位运算?    程序中的所有数在计算机内存中都是以二进制的形式储存的.位运算说穿了,就是直接对整数在内存中的二进制位进行操作.由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快. 各种位运算的使用 === 1. and运算 ===(同真为真) and运算通常用于二进制取位操作,例如一个数 and 1的结果就是取二进制的最末位.这可以用来判断一个整数的奇偶,二进制的最末位为0表示该数为偶数,最末位为1表示该数为奇数. === 2. or运算 ===(一真为真) or运算通

位运算和关于两个数交换的多种方法

我们知道,位运算在计算中有着广泛的应用. 在计算机的各种编程语言中位运算也是一种不可缺少的运算,尤其是在计算机的底层实现代码中. 以下我们就来介绍一下位运算. 1.左移运算<<  左移右移都是移动二进制数 0000-0000 0000-0000 0000-0000 0000-1100     =12 向左移动一位变为(右边缺几位就补几个0) 0000-0000 0000-0000 0000-0000 0001 1000       =24 再向左移一位 0000-0000 0000-0000