C语言----位运算,进阶篇二十六)

技术C语言----位运算,进阶篇二十六) C语言----位运算(进阶篇二十六)作用在小内存时代,经常把一个字节分成好几份来用,以达到节约内存的目的。现在经常用于网络数据传输,单片机领域……。注意:※在进

c位操作(高级第26章)

  作用

在小内存时代,为了节省内存,一个字节经常被分成几个部分。

现在常用于网络数据传输和单片机领域。

注意:

任何位运算之前,任何表达式的结果首先都要转换成二进制,计算后切换回原始二进制就可以得到结果。.

不能对浮点数执行位操作。.

  按位与

格式:二进制二进制。

例如:

int a=35

记忆法:在逻辑和运算中,两边的表达式为真,结果为真。因此,当执行按位“与”运算时,两位都为1,结果为1。

角色:

清除:要清除一个位,将相应的位设置为0,其他位设置为1,然后使用该操作。

取指定位:如果要取某一位,可以将对应位设为1,其他位设为0,然后使用该操作。

  按位或

格式:二进制|二进制。

例如:

int a=3 | 5;

记忆法:在逻辑OR运算中,两边的表达式有一个为真,结果为真。因此,当执行按位“或”运算时,一位为1,结果为1。

角色:

将某个位置设置为1:要将某个位置设置为1,请将相应的位设置为1,然后使用|操作。

  按位异或

格式:二进制二进制。

例如:

国际a=3^5;

记忆法:“不一样”的意思是不同的意思,异或实际上是判断两个数是否“不一样”,如果不一样就是真的。因此,在按位异或中,两个数字不同,结果是1。

定理:

1,任何数字及其异或都是0。

2.任何数字和0的异或值不变。

角色:

翻转位:翻转一个位,将对应位置设置为1,第一次使用操作翻转,第二次使用操作翻转回来。.早期的鼠标指针使用图形异或运算,所以速度非常快。

交换两个没有临时变量的值。.如果a=4和b=5,它们可以用下列语句互换:

a=a^b;

b=b^a;

a=a^b;

根据等价替换法,a=a b,那么b=b a等价于b=b (a b),b=b a b去掉括号,b=b=b^a项移位,根据定理1 b=0 a,根据定理2 b=a。

此时,b的值为4,而a只是一个中间值。

A=a b相当于a=(a b) (b a b),a=a b b a b去掉括号,a=a b b a b项移位,根据定理1 a=0 0 b,根据定理2 a=b。

此时A的值为5,交换结束。

程序1

矩阵异或

//26-1异或矩阵. c。

//翻转位:翻转一点,

//对应的位置可以设置为1,第一次操作可以翻转,第二次操作可以翻转回来。

#包含stdio.h

main()

{

//源矩阵

int a[4][4]=

{

{1,2,3,4},

{1,2,3,4},

{1,2,3,4},

{1,2,3,4}

};

//源矩阵

/*

int a[4][4]=

{

{8,8,6,6},

{8,8,6,6},

{6,6,8,8},

{6,6,8,8}

};

*/

//异或矩阵

int b[4][4]=

{

{0,3,3,0},

{3,0,0,3},

{3,0,0,3},

{0,3,3,0},

};

//输出源矩阵 和 异或矩阵
printf("输出源矩阵和异或矩阵\n");
for (int i = 0; i 4; i++)
{
for (int j = 0; j 4; j++)
{
printf("%d ", a[i][j]); //输出源矩阵
}
printf("\t");
for (int j = 0; j 4; j++)
{
printf("%d ", b[i][j]);
}
printf("\n");
}
//输出第一次异或后的矩阵
printf("第一次异或后的矩阵:\n");
for (int i = 0; i 4; i++)
{
for (int j = 0; j 4; j++)
{
a[i][j] ^= b[i][j];
printf("%d ", a[i][j]);
}
printf("\n");
}
//第二次异或后的矩阵 在次异或就会复原最初始的矩阵
printf("第二次异或后的矩阵:\n");
for (int i = 0; i 4; i++)
{
for (int j = 0; j 4; j++)
{
a[i][j] ^= b[i][j];
printf("%d ", a[i][j]);
}
printf("\n");
}
}

  按位取反

    格式:~二进制

      如:int a=~3;

      得到11111100,它是个负数。

  左移

    格式:二进制要移动的位数

    如:

      int a=32;

      相当于000000112得到00001100

      转成十进制后,a的值为12

    作用:将二进制数左移一定的位数,最右边补0。任何一位移出左边界,自动丢弃。

    ※不越界的左移相当于让变量值乘以2。

  右移

    格式:二进制要移动的位数

      如:

        int a=122;

        相当于000011002得到00000011

        转成十进制后,a的值为3

    作用:将二进制数右移一定的位数,最左边补0(或1)。任何一位移出右边界,自动丢弃。

    ※不越界右移相当于让变量值除以2。

    注意:右移比左移要复杂些,如果要移的数为负数,最左边符号位为1,为了不改变此数的符号位,往右移的时候,左边会自动补1。

    位运算的优先级:~ 高于 高于 高于^ 高于|

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/61503.html

(0)

相关推荐

  • 如何理解MySQL索引cardinalit

    技术如何理解MySQL索引cardinalit本篇内容主要讲解“如何理解MySQL索引cardinalit”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“如何理解MySQL索引

    攻略 2021年10月29日
  • 抖音真人赞10个自助下单,介绍下抖音刷真人赞多少钱?

    技术抖音真人赞10个自助下单,介绍下抖音刷真人赞多少钱?于抖音新手怎么快速涨粉丝?
    1、大量关注别人,这样必定会带来许多的粉
    2、评论别人,不停地评论陌生人的抖音,只要看到有人发抖音就去留下高质量的评论,每次都坐上沙发,

    测评 2021年11月9日
  • worst,worst是bad的最高级吗

    技术worst,worst是bad的最高级吗bad在早期现代英语时变比较级和最高级是符合规则的,后来“badder”和“baddest”才被完全被另外两个词代替掉worst。 Worse和worst确实是比较级和最高级的

    生活 2021年10月30日
  • redis有哪些内存淘汰策略如何配置(redis中线程安全的方法)

    技术Redis中线程IO模型是什么这篇文章将为大家详细讲解有关Redis中线程IO模型是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Redis是一个单线程的应用程序,NodeJs

    攻略 2021年12月21日
  • MongoDB 的简单使用

    技术MongoDB 的简单使用 MongoDB 的简单使用MongoDB数据库操作
    Student文档如下:{
    “name”: “zhangsan”,
    “score”: {
    “English”: 69,

    礼包 2021年10月26日
  • ceph块存储场景

    技术ceph块存储场景 ceph块存储场景1、创建rbd使用的存储池。admin节点需要安装ceph才能使用该命令,如果没有,也可以切换到ceph-node1节点去操作。[cephfsd@ceph-ad

    礼包 2021年11月29日