概述:

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. ADO.NET操作SQL Server:数据库操作类(未封装)

    1.添加数据 /// <summary> /// 添加数据 /// </summary> /// <param name="newEntity"> ...

  2. Windows10 下 github ssh 访问出现 Permission denied(publickey)错误的解决方法

    Windows10 下 github ssh 访问出现 Permission denied(publickey)错误的解决方法. 错误信息: git clone git@github.com:ediw ...

  3. C语言/C++编程学习:不做C/C++工作也要学C/C++的原因!

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  4. jQuery操作标签--样式、文本、属性操作, 文档处理

    1.样式 2.文本 3.属性操作 全选,反选效果 4.文档处理 操作标签 一.样式操作 样式类: addClass(); // 添加指定的css类名 removeClass(); //移除指定的css ...

  5. 【timeisprecious】【JavaScript 】JavaScript String 对象

    JavaScript>String 对象 1 .From Runnob JavaScript String 对象(概览) JavaScript String 对象(教程)

  6. java使用Redis2--保存对象

    Redis中并没有提供set(String key, Object obj)的方法,但提供了set(final byte[] key, final byte[] value) 的方法,可以通过把对象转 ...

  7. re 模块 常规方法使用

    前情提要: re模块主要用于正则,用的好了秒杀一切匹配的规则,这里主要是介绍基本用法 一:元字符 1:\w 匹配字符,包含中文,数字或下划线 l ='早乙女露依 123 是我的 321 心目中的 22 ...

  8. python 之 比较哪个数据大小

    #定义一个字典info={}#定义比较的人数n=int(input("请输入你要比较的人数"))#循环while(n): #输入a,b 两个数据 ,分别代表学号 和分数 # 把输入 ...

  9. leetcode-78-子集(用bfs解决)

    题目描述: 给定一组不含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集). 说明:解集不能包含重复的子集. 示例: 输入: nums = [1,2,3] 输出: [ [3],   [1] ...

  10. 自定义ASP.NET Core日志中间件

    这个日志框架使用的是ASP.NET Core的NLog,用来记录每次请求信息和返回信息. 1.首先创建一个Web应用项目,我选择的是MVC模板: 2.使用NuGet添加Microsoft.Extens ...