位运算

来源:互联网 发布:github源码在微信上 编辑:程序博客网 时间:2024/06/03 22:52
与 &
  1. 计算
  2. 取特定位


或 |
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:长度;
}
 
  一个位段必须被说明是intunsignedsigned中的一种


**
循环移动例子:
#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));                    /*将右移后的结果输出*/
}



































原创粉丝点击