位运算
来源:互联网 发布:github源码在微信上 编辑:程序博客网 时间:2024/06/03 22:52
与 &
- 计算
- 取特定位
或 |
1.计算
2.要将某几位置一,就用与这几位是1的书进行 或
取反 ~
1.按位取反(变成二进制取反)
异或 ^
两个数不同时为1,否则为0
1.使特定的位翻转,要将后七位翻转,就与后七位是1的数异或
2.在不使用临时变量的情况下实现俩个变量的互换
3.经常用在简单的加密算法上
左移 << 双目运算符
高位丢弃,地位补0
1.左移一位相当于*2,
右移 >>
正数时:高位补0
负数时:补0 逻辑右移,补1,算数右移
循环移位:
left(unsigned value, int n) /*自定义左移函数*/
{
unsigned z;
z = (value >> (32-n)) | (value << n); /*循环左移的实现过程*/
return z;
}
右移
right(unsigned value, int n) /*自定义右移函数*/
{
unsigned z;
z = (value << (32-n)) | (value >> n); /*循环右移的实现过程*/
return z;
}
位段
位段类型是一种特殊的结构类型,其所有成员的长度均是以二进制位为单位定义的,结构中的成员被称为位段。位段定义的一般形式为:
结构 结构名
{
类型 变量名1:长度;
类型 变量名2:长度;
……
类型 变量名n:长度;
}
一个位段必须被说明是int、unsigned或signed中的一种
**
循环移动例子:
#include <stdio.h>
left(unsigned value, int n) /*自定义左移函数*/
{
unsigned z;
z = (value >> (32-n)) | (value << n); /*循环左移的实现过程*/
return z;
}
right(unsigned value, int n) /*自定义右移函数*/
{
unsigned z;
z = (value << (32-n)) | (value >> n); /*循环右移的实现过程*/
return z;
}
main()
{
unsigned a;
int n;
printf("please input a number:\n");
scanf("%o", &a); /*输入一个八进制数*/
printf("please input the number of displacement(>0):\n");
scanf("%d", &n); /*输入要移位的位数*/
printf("the result is %o:\n", left(a, n)); /*将左移后的结果输出*/
printf("the result is %o:\n", right(a, n)); /*将右移后的结果输出*/
}