二进制加,减法,23个位运算技巧

article/2025/9/13 22:56:10

在这里插入图片描述

二进制加,减法

二进制最高位为1时表示负数,为0时表示正数。
**原码:**一个正数,转换为二进制位就是这个正数的原码。负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码。
举例说明:
      int类型的 3 的原码是 11B(B表示二进制位), 在32位机器上占四个字节,那么高位补零就得:
      00000000 00000000 00000000 00000011
      int类型的 -3 的绝对值的二进制位就是上面的 11B 展开后高位补零就得:
      10000000 00000000 00000000 00000011
**反码:**正数的反码就是原码,负数的反码等于原码除符号位以外所有的位取反。
举例说明:
      int类型的 3 的反码是
      00000000 00000000 00000000 00000011
      和原码一样没什么可说的
      int类型的 -3 的反码是
      11111111 11111111 11111111 11111100
      除开符号位 所有位 取反
**补码:**正数的补码与原码相同,负数的补码为 其原码除符号位外所有位取反(得到反码了),然后最低位加1.
还是举例说明:
      int类型的 3 的补码是:
      00000000 00000000 00000000 00000011
      int类型的 -3 的补码是
      11111111 11111111 1111111 11111101
      就是其反码加1

最后总结一下:
    正数的反码和补码都与原码相同。
    负数的反码为对该数的原码除符号位外各位取反。
    负数的补码为对该数的原码除符号位外各位取反,然后在最后一位加1。

二进制运算法则:

二进制的运算算术运算
二进制的加法:0+0=0,0+1=1 ,1+0=1, 1+1=10(向高位进位);即7=111
10=1010 3=11
二进制的减法:0-0=0,0-1=1(向高位借位) 1-0=1,1-1=0 (模二加运算或异或运算) ;
二进制的乘法:0 * 0 = 0 0 * 1 = 0,1 * 0 = 0,1 * 1 = 1
二进制的除法:0÷0 = 0,0÷1 = 0,1÷0 = 0 (无意义),1÷1 = 1 ;
逻辑运算二进制的或运算:遇1得1 二进制的与运算:遇0得0 二进制的非运算:各位取反。 在这里插入图片描述

例如101001-011010=001111(41-26=15)的运算。灰色部分为计算过程,绿色字为被减一得到的数,红色字为借一后得到的数。
在运算过程中,从右往左逐位进行计算。
1-0=1;
0不够减1,向前借一后加2变成2;2-1=1;
0在上一步被借一所以减为-1,-1不够减0,向前借一后加2变成1;1-0=1;
1在上一步被借一所以减为0,0不够减1,向前借一后加2变成2;2-1=1;
0在上一步被借一所以减为-1,-1不够减1,向前借一后加2变成1;1-1=0;
1在上一步被借一所以减为0,0-0=0.
由此推出:数不够减就向前借一位,然后该数加2.

可见二进制和十进制减法的区别就是向前借一后加2.

23个位运算技巧

1.获得int型最大值`


int getMaxInt(){return (1 << 31) - 1;//2147483647, 由于优先级关系,括号不可省略
}

另一种写法


int getMaxInt(){return ~(1 << 31);//2147483647
}

C语言中不知道int占几个字节时候


int getMaxInt(){return ((unsigned int) - 1) >> 1;//2147483647
}

2.获得int型最小值


int getMinInt(){return 1 << 31;//-2147483648
}//第二种
int getMinInt(){//有些编译器不适用return 1 << -1;//-2147483648
}

3.获得long类型的最大值

//C语言
long getMaxLong(){return ((unsigned long) - 1) >> 1;//2147483647
}
//java
long getMaxLong(){return ((long)1 << 127) - 1;//9223372036854775807
}

4.乘以2运算

int mulTwo(int n){//计算n*2 return n << 1;  
}

5.除以2运算

int divTwo(int n){//负奇数的运算不可用return n >> 1;//除以2
}

6.乘以2的m次方


int mulTwoPower(int n,int m){//计算n*(2^m)return n << m;
}

7.除以2的m次方

int divTwoPower(int n,int m){//计算n/(2^m)return n >> m;
}

8.判断一个数的奇偶性


boolean isOddNumber(int n){ // 判断是否为奇数return (n & 1) == 1;// n为奇数你。n为偶数时,n & 1 == 0。
}

9.不用临时变量交换两个数(面试常考)

//c语言
void swap(int *a,int *b){ (*a) ^= (*b) ^= (*a) ^= (*b); 
}//其他语言
a ^= b;
b ^= a;
a ^= b;

10.取绝对值(某些机器上,效率比n>0 ? n:-n 高)


int abs(int n){
return (n ^ (n >> 31)) - (n >> 31);
/* n>>31 取得n的符号,若n为正数,n>>31等于0,若n为负数,n>>31等于-1 
若n为正数 n^0=0,数不变,若n为负数有n^-1 需要计算n和-1的补码,然后进行异或运算, 
结果n变号并且为n的绝对值减1,再减去-1就是绝对值 */
}

11.取两个数的最大值(某些机器上,效率比a>b ? a:b高)
通用版

int max(int a,int b){return b & ((a-b) >> 31) | a & (~(a-b) >> 31);/*如果a>=b,(a-b)>>31为0,否则为-1*/
}

C语言版

int max(int x,int y){return x ^ ((x ^ y) & -(x < y));/* 如果x<y x<y返回1,否则返回0, 与0做与运算结果为0,与-1做与运算结果不变 */
}

12.取两个数的最小值(某些机器上,效率比a>b ? b:a高)
通用版

int min(int a,int b){return a & ((a-b) >> 31) | b & (~(a-b) >> 31);/*如果a>=b,(a-b)>>31为0,否则为-1*/
}

C语言版

int min(int x,int y){return y ^ ((x ^ y) & -(x < y));/*如果x<y x<y返回1,否则返回0, 与0做与运算结果为0,与-1做与运算结果不变*/
}

13.判断符号是否相同

bool isSameSign(int x, int y){ //有0的情况例外return (x ^ y) >= 0; // true 表示 x和y有相同的符号, false表示x,y有相反的符号。
}

14.计算2的n次方

int getFactorialofTwo(int n){//n > 0return 2 << (n-1); // 2的n次方
}

int getFactorialofTwo(int n) {return 1 << n; // 2的n次方
}

15.判断一个数是不是2的幂

bool isFactorialofTwo(int n){return n > 0 ? (n & (n - 1)) == 0 : false;/*如果是2的幂,n一定是100... n-1就是1111.... 所以做与运算结果为0*/
}

16.对2的n次方取余

int quyu(int m,int n){//n为2的次方return m & (n - 1);/*如果是2的幂,n一定是100... n-1就是1111.... 所以做与运算结果保留m在n范围的非0的位*/
}

17.求两个整数的平均值

int getAverage(int x, int y){return (x + y) >> 1;
}

另一种写法

int getAverage(int x, int y){return ((x ^ y) >> 1) + (x & y); /*(x^y) >> 1得到x,y其中一个为1的位并除以2, x&y得到x,y都为1的部分,加一起就是平均数了*/
}

18.从低位到高位,取n的第m位

int getBit(int n, int m){return (n >> (m-1)) & 1;
}

19.从低位到高位,将n的第m位置1

int setBitToOne(int n, int m){return n | (1 << (m-1));/*将1左移m-1位找到第m位,得到000...1...000 n在和这个数做或运算*/
}

20.从低位到高位,将n的第m位置0

int setBitToZero(int n, int m){return n & ~(1 << (m-1));/* 将1左移m-1位找到第m位,取反后变成111...0...1111 n再和这个数做与运算*/
}

21.取相反数

~n + 1;
//或~(n - 1)
//或
(n ^ -1) + 1;

22.取整数n的二进制中最后一个1

// 写法一:
-n&n 
// 写法二:
(~n+1)&n
// 写法三:
~(n - 1)&n

23.去掉整数n的二进制中最后一个1
如:n = 010100, n -1 = 010011, n&(n - 1) = 010000。

n & (n - 1)

另附一些对程序效率上没有实质提高的位运算技巧,一些也是位运算的常识(面试也许会遇到)

1.计算n+1

-~n

2.计算n-1

~-n

3.if(x == a) x = b; if(x == b) x = a;

x = a ^ b ^ x;

4.sign函数,参数为n,当n>0时候返回1,n<0时返回-1,n=0时返回0

return !!n - (((unsigned)n >> 31) << 1);

http://chatgpt.dhexx.cn/article/bmaQANtK.shtml

相关文章

二进制的加减法_二进制加减法

二进制的加减法 1)二进制加法 (1) Binary Addition) Since binary numbers consist of only two digits 0 and 1, so their addition is different from decimal addition. Addition of binary numbers can be done following certain rules: 由于二进制数仅由两位数字0和1组成…

补码二进制减法计算

二进制减法计算 -1 - 1 二进制表示为 -1 1 -2 补码1111 ... 1110 原码1000 ... 0010 如果是5 - 3 如果-12 如果Int_min - 1 127 此处是在Int的范围&#xff0c;所以在环内-1到了127 如果不在int范围中&#xff0c;在二进制中&#xff0c;结果就是-(int_min1)…

二进制减法图解

写在前面 二进制减法类似于十进制的减法&#xff0c;我们根据小学学过的十进制的减法来推出二进制减法如何进行运算。 十进制减法 例如74323-4756226761的运算。灰色部分为计算过程&#xff0c;绿色字为被减一得到的数&#xff0c;红色字为借一后得到的数。 在运算过程中&…

DenseNet简介

论文传送门&#xff1a;https://arxiv.org/pdf/1608.06993.pdf CNN模型的发展十分火热&#xff0c;自LeNet提出以来&#xff0c;涌现了一批优秀的CNN模型。 LeNet是CNN的开山之作&#xff0c;标志着CNN真正的提出。2012年AlexNet夺得ILSVRC2012的冠军&#xff0c;深度学习大火…

图像分类算法DenseNet论文解读

论文名称&#xff1a;Densely Connected Convolutional Networks 论文地址&#xff1a;https://arxiv.org/pdf/1608.06993.pdf 如果说ResNet扩展了网络的深度&#xff0c;GoogLeNet扩展了网络的宽度&#xff0c;那么DenseNet就是利用特征图的重用。 一、论文解读 1、DenseNet…

DenseNet论文笔记

DenseNet论文笔记 Densely Connected Convolutional Networks Introduction中引用了Deep networks with stochastic depth,提到了resnet里很多层都学不到东西&#xff0c;贡献很少可以随机丢掉&#xff0c;解释了InceptionV4里的Scaling of the Residuals操作&#xff0c;Ince…

DenseNet解析

1 前言 在计算机视觉领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09;已经成为最主流的方法&#xff0c;比如最近的GoogLenet&#xff0c;VGG-19&#xff0c;Incepetion等模型。CNN史上的一个里程碑事件是ResNet模型的出现&#xff0c;ResNet可以训练出更深的CNN模型…

denseNet 详解

CNN网络架构演进&#xff1a;从LeNet到DenseNet - Madcola - 博客园 (cnblogs.com) 1、解决梯度消失问题 2、特征图相应变少

DenseNet详述

简介 从2012年AlexNet大展身手以来&#xff0c;卷积神经网络经历了&#xff08;LeNet、&#xff09;AlexNet、ZFNet、VGGNet、GoogLeNet&#xff08;借鉴Network in Network&#xff09;、ResNet、DenseNet的大致发展路线。其实&#xff0c;自从ResNet提出之后&#xff0c;Res…

DenseNet

paper: Densely Connected Convolutional Networks Memory-Efficient Implementation of DenseNets code: https://github.com/pytorch/vision/blob/main/torchvision/models/densenet.py 在本篇文章中&#xff0c;作者提出了Dense Convolutional Network (DenseNet)&…

详解DenseNet(密集连接的卷积网络)

前言 在计算机视觉领域&#xff0c;卷积神经网络&#xff08;CNN&#xff09;已经成为最主流的方法&#xff0c;比如最近的GoogLenet&#xff0c;VGG-19&#xff0c;Incepetion等模型。CNN史上的一个里程碑事件是ResNet模型的出现&#xff0c;ResNet可以训练出更深的CNN模型&a…

DenseNet 简介

个人公众号,欢迎关注 YouChouNoBB 1.首先对深度学习做一个简单的回顾 2.介绍DenseNet 3.参考文献 1.1 DNN回顾 如下图所示是一个基本DNN结构&#xff0c;通过forward传播和backword传播来训练一个模型。包含input层&#xff0c;L个隐藏层和一个output&#xff0c;隐层使用的…

经典网络DenseNet介绍

经典网络DenseNet(Dense Convolutional Network)由Gao Huang等人于2017年提出&#xff0c;论文名为&#xff1a;《Densely Connected Convolutional Networks》&#xff0c;论文见&#xff1a;https://arxiv.org/pdf/1608.06993.pdf DenseNet以前馈的方式(feed-forward fashio…

DenseNet 浅析

文章目录 1. 简介2. DenseNet 浅析2.1 网络结构2.2 Dense Block2.3 Bottleneck Layer2.4 Trainsition Layer 3. 个人理解4. DenseNet-121 的 PyTorch 实现 1. 简介 DenseNet 见于论文《Densely Connected Convolutional Networks》&#xff0c;是 CVPR2017 的 oral。一般而言&a…

【深度学习原理第9篇】DenseNet模型详解

目录 一、背景概述二、DenseNet2.1 DenseBlock2.2 Transition Layer2.3 DenseNet网络结构 实验结果 一、背景概述 DenseNet是2017年CVPR的最佳论文&#xff0c;它不同于ResNet中的残差结构&#xff0c;也不同于GoogLetNet中的Inception网络结构。DenseNet提出了一种新的提升性…

DenseNet(密集连接的卷积网络)

这里写目录标题 前言1. DenseNet网络2.设计理念2.1 Resnet2.2 DenseNet2.3 密集连接的实现 3. DenseNet的实现3.1 Dense Block的实现3.2 Transition Layer的实现3.3 DenseNet网络3.4 DenseNet-121网络 4. 测试 前言 DenseNet是指Densely connected convolutional networks&…

DenseNet详解

入门小菜鸟&#xff0c;希望像做笔记记录自己学的东西&#xff0c;也希望能帮助到同样入门的人&#xff0c;更希望大佬们帮忙纠错啦~侵权立删。 ✨完整代码在我的github上&#xff0c;有需要的朋友可以康康✨ https://github.com/tt-s-t/Deep-Learning.git 目录 一、DenseNet网…

DenseNet网络结构详解及代码复现

1. DenseNet论文详解 Abstract: 如果在靠近输入和靠近输出层之间包含更短的连接&#xff0c;那么卷积神经网络可以很大程度上更深&#xff0c;更准确和高效地进行训练。根据这一结果&#xff0c;我们提出了DenseNet&#xff08;密集卷积网络&#xff09;: 对于每一层&#xf…

设计模式六大原则(6)开闭原则(Open Close Principle)

开闭原则&#xff08;Open Close Principle&#xff09; 定义&#xff1a;一个软件实体如类、模块和函数应该对扩展开放&#xff0c;对修改关闭。 问题由来&#xff1a;在软件的生命周期内&#xff0c;因为变化、升级和维护等原因需要对软件原有代码进行修改时&#xff0c;可…

Linux C/C++编程: 文件操作open/close、fopen与freopen/fclose

open是linux下的底层系统调用函数&#xff0c;fopen与freopen c/c下的标准I/O库函数&#xff0c;带输入/输出缓冲。 linxu下的fopen是open的封装函数&#xff0c;fopen最终还是要调用底层的系统调用open。 所以在linux下如果需要对设备进行明确的控制&#xff0c;那最好使用底…