第一章、1、逻辑运算符(与、或、移位)实现位运算
来源:互联网 发布:win7网络发现启用不了 编辑:程序博客网 时间:2024/06/06 00:53
一、问题描述
只使用逻辑运算符,实现位运算,即将第n个bit位置为1。
二、问题分析
1、C语言中,一个整数有32个bit位。给定数字n之后,应该将数组A[P]中的第Q位置为1。其中,P=n/32,Q=n%32。例如,若n=31,则P=0,Q = 31,即将A[0]中的第31位置为1。由于需要使用逻辑运算符,因此除运算使用移位运算实现,求余运算使用按位与运算。
2、移位运算:n<<5,将n的二进制形式向左移动5位,移出位丢弃,右侧补零。数值变为n*2^5。n>>5,将n的二进制形式向右移动5位,移出位丢弃,左侧补零,或符号位。数值变为n*2^5。本题中,P=n/32等价于P=n<<5。
3、按位与运算:Q=n%32,等价于n的二进制形式与31按位与预算,Q=n&31,即丢弃大于32的位,只保留小于等于31的bit。同理,若采用8位表示整数,则Q=n&7
三、C语言代码
#include <stdio.h>
#define MAX 10000000
#define SHIFT 5
#define MASK 0x1F
#define DIGITS 32
int a[1+MAX/DIGITS];
voidset(int n) //将逻辑位置为n的二进制位置为1
{
a[n>>SHIFT] |=(1<<(n&MASK)); //n>>SHIFT右移5位相当于除以32求算字节位置,n&MASK相当于对32取余即求位位置,
}
void clear(int n)
{
a[n>>SHIFT] &=(~(1<<(n&MASK))); //将逻辑位置为n的二进制位置为0
}
int test(int n)
{
return a[n>>SHIFT] & (1<<(n&MASK)); //测试逻辑位置为n的二进制位是否为1
}
int main(int argc,char *argv[])
{
int i,n;
for(i=1;i<=MAX;i++)
{
clear(i);
}
while(scanf("%d",&n)!=EOF)
{
set(n);
}
for(i=1;i<=MAX;i++)
{
if(test(i))
printf("%d ",i);
}
return 0;
}
- 第一章、1、逻辑运算符(与、或、移位)实现位运算
- 算数运算符(+-*/)优先级>移位运算>位运算>逻辑运算
- 编程珠玑 如何使用位逻辑运算(例如与、或、移位)来实现位向量
- 逻辑运算符 或 与 非 位运算
- 不使用按位运算符,实现或"|",与"&",左移位"<<",右移位">>"二进制运算
- 移位运算符 以及 位逻辑运算符
- Java 逻辑运算符、按位运算符、移位运算符
- 【C语言】移位运算符、位运算符、逻辑运算符
- 符号-分节4(逻辑运算符,位运算及左右移位运算)
- C语言中的逻辑运算符:按位与,按位或,按位异或,取反,左右移位
- 逻辑运算与位运算
- 位运算与逻辑运算
- Java 位运算(移位、位与、或、异或、非)
- Java 位运算(移位、位与、或、异或、非)
- Java 位运算(移位、位与、或、异或、非)
- Java 位运算(移位、位与、或、异或、非)
- Java 位运算(移位、位与、或、异或、非)
- Java 位运算(移位、位与、或、异或、非)
- 导出大量数据到Excel的一种方式
- 增量开发(incremental development)
- 将XP风格文件manifest合并到资源文件
- BitmapShader图片渲染
- html的框架frame中点退出刷新整个框架
- 第一章、1、逻辑运算符(与、或、移位)实现位运算
- Robots on a grid
- Agile和Scrum的学习方法推荐书籍
- 《代码揭秘-从C/C++的角度探秘计算机系统》读书笔记 之第二章
- oracle 中位数不够。。。的补位问题
- Yogurt factory
- 内存对齐问题
- Content Provider
- 范例 UIScrollView