百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 文章教程 > 正文

C|位运算模拟算术运算及某些位置0、置1、取反

xsobi 2024-11-23 10:50 1 浏览

1 按位与置0、按位或置1,按位异或取反

#include <stdio.h>
void printBinary(unsigned a)
{
    printf("\n%10u %X ",a,a);
    for(int i=31;i>=0;i--)
    {
        if((i+1)%4 == 0)
            printf(" ");
        if((a>>i & 1) == 1)
            printf("1");
        else
            printf("0");
    }
}
void test()
{
    unsigned data = 0x12345678;  // 305419896 // dec
    // 0001 0010 0011 0100 0101 0110 0111 1000 // binary
    printBinary(data);
    printf(" 原数据\n");
    unsigned mask = 0xFFFF0000;
    printBinary(mask);
    printf(" 掩码\n");
    unsigned a = data & mask;
    printBinary(a);
    printf(" 按位与&,后16位置0\n");
    unsigned b = data | mask;
    printBinary(b);
    printf(" 按位或|,前16位置1\n");
    unsigned c = data ^ mask;
    printBinary(c);
    printf(" 按位异或^,前16位取反\n");
}
int main()
{
    test();
    getchar();
    return 0;
}
/*

 305419896 12345678  0001 0010 0011 0100 0101 0110 0111 1000 原数据

4294901760 FFFF0000  1111 1111 1111 1111 0000 0000 0000 0000 掩码

 305397760 12340000  0001 0010 0011 0100 0000 0000 0000 0000 按位与&,后16位置0

4294923896 FFFF5678  1111 1111 1111 1111 0101 0110 0111 1000 按位或|,前16位置1

3989526136 EDCB5678  1110 1101 1100 1011 0101 0110 0111 1000 按位异或^,前16位取反

*/

2 按位运算与算术运算

2.1 二进制无进位加法

按位异域

0

0

1

1

^

0

1

0

1


0

1

1

0

2.2 二进制加法的进位

按位与

0

0

1

1

&

0

1

0

1


0

0

0

1

2.3 整型乘除

2.3.1 整型与一个2的某次幂相乘

用移位实现乘除法运算

a=a<<3; // a=a*(2^3);

b=b>>3; // b=b/(2^3);

2.3.2 整型与一个非2的某次幂相乘

a = a<<3+a; // a=a*9→a=a*(a^3+1)

3 整型按位乘法

移位相加实现二进制乘法:

移位、相加:

10110011*1101 // 179*13

= 179<<0*1+179<<1*0+179<<2*1+179<<3*1

= 0000 0000 0000 0000 1001 0001 0111 //2327

4 整型按位除法

2进制完成除法运算就是移位相减,比如1011011除以1110(91/14)顺序如下:

被除数

1

0

1

1

0

1

1

除数左对齐

1

1

1

0



除数对齐到小于被除数的位置

被除数

1

0

1

1

0

1

1




1

1

1

0








1

0

0


余数


1

0

0

0

1

1


余数继续相除:

被除数

1

0

1

1

0

1

1

除数


1

1

1

0







1

0

0

余数


1

0

0

0

1

1

除数



1

1

1

0






1

1

0

余数





1

1

1

1011011 / 1110 = 110 + 111 // 91/14 = 6+7

1011011 = 1110 * 0000110 + 111 // 91 = 14 * 6 + 7

-End-

相关推荐

js向对象中添加元素(对象,数组) js对象里面添加元素

一、添加一个元素对象名["属性名"]=值(值:可以是一个值,可以是一个对象,也可以是一个数组)这样添加进去的元素,就是一个值或对象或数组...

JS小技巧,如何去重对象数组?(一)

大家好,关于数组对象去重的业务场景,想必大家都遇到过类似的需求吧,这对这样的需求你是怎么做的呢。下面我就先和大家分享下如果是基于对象的1个属性是怎么去重实现的。方法一:使用.filter()和....

「C/C++」之数组、vector对象和array对象的比较

数组学习过C语言的,对数组应该都不会陌生,于是这里就不再对数组进行展开介绍。模板类vector模板类vector类似于string,也是一种动态数组。能够在运行阶段设置vector对象的长度,可以在末...

如何用sessionStorage保存对象和数组

背景:在工作中,我将[{},{}]对象数组形式,存储到sessionStorage,然后ta变成了我看不懂的形式,然后我想取之用之,发现不可能了~记录这次深刻的教训。$clickCouponIndex...

JavaScript Array 对象 javascript的array对象

Array对象Array对象用于在变量中存储多个值:varcars=["Saab","Volvo","BMW"];第一个数组元素的索引值为0,第二个索引值为1,以此类推。更多有...

JavaScript中的数组Array(对象) js array数组

1:数组Array:-数组也是一个对象-数组也是用来存储数据的-和object不同,数组中可以存储一组有序的数据,-数组中存储的数据我们称其为元素(element)-数组中的每一个元素都有一...

数组和对象方法&amp;数组去重 数组去重的5种方法前端

列举一下JavaScript数组和对象有哪些原生方法?数组:arr.concat(arr1,arr2,arrn);--合并两个或多个数组。此方法不会修改原有数组,而是返回一个新数组...

C++ 类如何定义对象数组?初始化数组?linux C++第43讲

对象数组学过C语言的读者对数组的概念应该很熟悉了。数组的元素可以是int类型的变量,例如int...

ElasticSearch第六篇:复合数据类型-数组,对象

在ElasticSearch中,使用JSON结构来存储数据,一个Key/Value对是JSON的一个字段,而Value可以是基础数据类型,也可以是数组,文档(也叫对象),或文档数组,因此,每个JSON...

第58条:区分数组对象和类数组对象

示例设想有两个不同类的API。第一个是位向量:有序的位集合varbits=newBitVector;bits.enable(4);bits.enable([1,3,8,17]);b...

八皇后问题解法(Common Lisp实现)

如何才能在一张国际象棋的棋盘上摆上八个皇后而不致使她们互相威胁呢?这个著名的问题可以方便地通过一种树搜索方法来解决。首先,我们需要写一个函数来判断棋盘上的两个皇后是否互相威协。在国际象棋中,皇后可以沿...

visual lisp修改颜色的模板函数 怎么更改visual studio的配色

(defunBF-yansemokuai(tuyuanyanse/ss)...

用中望CAD加载LISP程序技巧 中望cad2015怎么加载燕秀

1、首先请加载lisp程序,加载方法如下:在菜单栏选择工具——加载应用程序——添加,选择lisp程序然后加载,然后选择添加到启动组。2、然后是添加自定义栏以及图标,方法如下(以...

图的深度优先搜索和广度优先搜索(Common Lisp实现)

为了便于描述,本文中的图指的是下图所示的无向图。搜索指:搜索从S到F的一条路径。若存在,则以表的形式返回路径;若不存在,则返回nil。...

两个有助于理解Common Lisp宏的例子

在Lisp中,函数和数据具有相同的形式。这是Lisp语言的一个重大特色。一个Lisp函数可以分析另一个Lisp函数;甚至可以和另一个Lisp函数组成一个整体,并加以利用。Lisp的宏,是实现上述特色的...