概述:

C语言的位级运算可以运用到任何“整数”的数据类型上,如char、short、int、long、long long、或者unsigned这样的限定词。基本的位运算有与、或、非、异或等等。

C语言的位移运算有两种:左移、右移:
左移运算:x<<k 表示x向左移动k位,丢弃最高的k位,并在右端补k个0。
右移运算:分逻辑右移 和 算术右移
               逻辑右移:在左端补k个0
               算术右移:在左端补k个最高有效位的值(它对有符号整数数据的运算非常有用)
对于无符号数据(unsigned声明的整数对象),右移必须是逻辑的;
对于有符号数据,几乎所有的编译器/机器组合都使用算术右移。

经典示例:

计算一个数的二进制表示中1的个数

int countBinary1(unsigned int n)
{
int count=;
while(n)
{
//判断n的最低位是否为1,然后将n逻辑右移1位,直到n等于0
if(n&)
count++;
n=n>>;
}
return count;
} int countBinary1_2(int n)
{
int count=;
unsigned int flag=;
while(flag)
{
//从第1位到第32位,依次检测n的各位是否为1
if(n&flag)
count++;
flag=flag<<;
}
return count;
} int countBinary1_3(unsigned int n)
{
int count=;
while(n)
{
n=n&(n-);//将最低的值为1的位 置为0,其余位保持不变。直到将整个n变为0。例如,1100&1011=1000
count++;
}
return count;
}

交换两个数(不借助第三变量)

//对于任何a来说,a^a=0 , n^a^a=n
void swapInt(int*a,int*b)
{
*a=*a^*b;
*b=*a^*b;
*a=*a^*b;
}

求一个数的绝对值

//对于一个正整数n, n>>31等于0
//对于一个负整数n, n>>31等于-1,-1的二进制表示为(111...11)各位都为1,(n^-1)+1即为n的绝对值。
int absInt(int n)
{
//return (n^-1)+1;
return(n^n>>)-(n>>);
}

将整数n的第k位设为1。(最低位为第1位)

int setBinary1(int n,int k)
{
return n|<<(k-);
}

获得整数n的第k位的值。(最低位为第1位)

int getBinary(int n, int k){
return n>>(k-)&;
}

C语言位运算、移位运算 经典示例的更多相关文章

  1. C语言 位运算

    1G=1024M; 1M=102KB; 1KB=1024B(字节); 1B=8bits(位); #include<stdio.h> #include<stdlib.h> //C ...

  2. C语言位运算

    C语言位运算详解    位运算是指按二进制进行的运算.在系统软件中,常常需要处理二进制位的问题.C语言提供了6个位操作运算符.这些运算符只能用于整型操作数,即只能用于带符号或无符号的char,shor ...

  3. C语言移位运算

    移位运算有两种:>>(右移),<<(左移). a>>b表示将a的二进制值右移b位. a<<b 表示将a的二进制值左移 b位.要求 a和 b都是整型, b ...

  4. JAVA:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题(5)

    一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是符号位, ...

  5. Java学习第五篇:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题

    一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是符号位, ...

  6. Java中的位运算符、移位运算

    一.位运算 Java中有4个位运算,它们的运算规则如下: (1)按位与 (&)  :两位全为1,结果为1,否则为0: (2)按位或  (|)   :两位有一个为1,结果为1,否则为0: (3) ...

  7. C语言位运算+实例讲解(转)

    按位或 按位与 按位异或 按位取反 左移右移 C语言位运算 有6种: &, | , ^(亦或), >(右移). 注意:参与位运算的元素必须是int型或者char型,以补码形式出现. 按位 ...

  8. java中位运算和移位运算详解

    一.位运算 (1)按 位 与 & 如果两个相应的二进制形式的对应的位数都为1,则结果为1,记为同1为1,否则为0.首先我们看一下对正数的运算        分别看一下正数和负数的具体运算步骤 ...

  9. 从JavaScript的移位运算看数字在计算机内部的编码——补码

    偶然看到一个JavaScript的题目: js中13>>2=?      -13>>2=? 在浏览器中很容易测试出答案分别是 3 和 -4. 13>>2 = 3 很 ...

随机推荐

  1. 在一般处理程序里面读写session

    1.引用命名空间 using System.Web.SessionState; 2.继承IRequiresSessionState接口 3.利用httpcontext类读写即可 context.ses ...

  2. WPF 组织机构下拉树多选,递归绑定方式现实

    使用HierarchicalDataTemplate递归绑定现实 XAML代码: <UserControl x:Class="SunCreate.CombatPlatform.Clie ...

  3. 【OCP-12c】CUUG 071题库考试原题及答案解析(19)

    1.choose the best answerWhat is the primary difference between the relational database (RDB) andobje ...

  4. 微信小程序二维码是无法识别二维码跳转到小程序

    今天测试了一下,微信小程序圆形二维码是不能直接识别跳转到小程序: 但h5页面的那种微信公众号二维码是可以直接识别

  5. “全栈2019”Java异常第二章:如何处理异常?

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java异 ...

  6. [JS] 气球放气效果

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <meta name ...

  7. .NET Core容器化之多容器应用部署-使用Docker-Compose

    原文补充: -- docker-compose.ymlversion: ' services: mvc-web: container_name: mvc.web.compose build: . re ...

  8. 2016级算法期末上机-E.中等·ModricWang's Fight with DDLs II

    1125 ModricWang's Fight with DDLs II 思路 圆内被划分部分数的计算方式如下: 圆内部的每一个交点都使得总份数增加了一:除此之外,每一根直线段最后抵达圆周时,总份数也 ...

  9. Spring Security 入门

    一.Spring Security简介 Spring Security是一个能够为基于Spring的企业应用系统提供声明式的安全访问控制解决方案的安全框架.它提供了一组可以在Spring应用上下文中配 ...

  10. Android Fragment向另一个Activity传值

    1.Fragment内: Intent intent=new Intent(getActivity(),ShowDataActivity.class); //参数1:Fragment所依存的Activ ...