位运算实现加减乘除

位运算如何实现加减乘除 关注二进制的加法,我们容易发现这样的一个规律:(1)位运算异或与求和运算结果一致异或逻辑运算:1^1=0,1^0=1,0^1=1,0^0=0求和算术运算:1+1=0,1+0=1,0+1=1,0+0=0(2)位运算与逻辑运算与求“进位”的结果一致。与逻辑运算:1&1=1,1&0=0,0&1=0,0&0=0求进位运算:1+1=1,1+0=0,0+1=0,0+0=01.位... 阅读详情

位运算符简介

^: 按位异或;&:按位与; | :按位或

加法运算
  • 不进位加法:sum = a^b;
  • 进位加法: sum = (a&b) <<1;
  • 所以可以递归计算所有的进位,等到进位完全加完就得到加法的结果。
减法运算
  • 负数表示为:~x + 1。所以可以将减法转换为加上~x+1。
乘法运算
  • a×b:乘法可以表示a个b相加。
除法运算
  • a/b:可以表示为a最多能够减去b的个数。
实现
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
#include <queue>
#include <stack>
using namespace std;

//使用位运算实现加减乘除
int Add(int a, int b){
    return b ? Add(a ^ b, (a & b) << 1) : a;
}
//减法:加上负数,负数为  ~b+1
int negative(int a){
    return Add(~a, 1);
}
int Minus(int a,int b){
    Add(negative(b), a);
}
//乘法:把b个a相加
int Mul(int a, int b){
    int res =0;
    bool isNegative = false;
    if(a < 0){
        isNegative = !isNegative;
        a = -a;
    }
    if(b < 0){
        isNegative = !isNegative;
        b = -b;
    }
    while(a > 0 && b > 0){
        res = Add(res, b);
        a = Minus(a,1);
    }
    if(isNegative) res = -res;
    return res;
}
//除法:看a最多能减去多少b
int Devide(int a,int b){
    int res = 0;
    bool isNegative = false;
    if(a < 0){
        a = -a;
        isNegative = !isNegative;
    }
    if(b < 0){
        b= -b;
        isNegative = !isNegative;
    }
    while(a >= b){
        res++;
        a = Minus(a,b);
    }

    if(isNegative) res =  -res;
    return res;

}
int main(){
    cout<< Add(100, 9)<<endl;
    cout<<Minus(100,9)<<","<<Minus(9,100)<<endl;
    cout<<Mul(100,9)<<","<<Mul(-100,9)<<endl;
    cout<<Devide(100,9)<<","<<Devide(9,-100)<<endl;
    return 0;
}
位运算实现加减乘除运算——超详细C语言描述 ** 位运算实现整数加减乘除运算——C语言描述 ** 本文将从位运算的种类、原理、运用入手,详细介绍如何仅使用位运算实现整数的加减乘除运算,代码采用C语言实现。** ** 1.位运算 ** 我们知道,程序中的所有数据在计算机内存中都是以二进制的形式存放的,所谓的位运算就是直接对整数在内存中的二进制位进行操作。位运算是早期计算机的基础,正因如此,在计算机组成原理课程中我们经常会注意到位运算的存在。时... 阅读详情

相关推荐

用位运算实现整数的加减乘除运算

基本的C++位运算符有:&(与)、|(或)、~(取反)、^(异或)、>>(右移)、众所周知,采用位运算可以极大的提高代码的运行效率。如果有的程序需要处理海量数据,其中又涉及大量简单的加减乘除运算,则可以用位运算来进行操作,减少程序的执行时间。   例如,a int a=5,b; b=a<<3; cout输出结果为:b=40 即b=a     这里有个问题,那就是如果乘数不是2的n次方的形

u011433274的专栏 2189

位运算实现加减乘除运算

我们知道,计算机最基本的操作单元是字节(byte),一个字节由8个位(bit)组成,一个位只能存储一个0或1,其实也就是高低电平。无论多么复杂的逻辑、庞大的数据、酷炫的界面,最终体现在计算机最底层都只是对0101的存储和运算。因此,了解位运算有助于提升我们对计算机底层操作原理的理解。

Mosum的博客 2万+

位运算算法篇:位运算实现加减乘除

一文帮组你掌握位运算实现加减乘除运算!

努力努力再努力wz的博客 1397

只使用位运算实现加减乘除

LeetCode 29. 两数相除, 原题目的要求是不能使用乘法, 除法和取余运算符实现除法; 在本篇博客中把题目要求提高一点, 这里只使用位运算来实现, 顺便的也就把只使用位运算实现加减乘除实现了.

trong_ 的烂笔头 2665

html+js实现加减乘除运算

html+js实现加减乘除运算, blog: http://blog.youkuaiyun.com/zhulei632/article/details/23596299

Logisim 原码一位乘法器设计 图解及代码(计算机组成原理)

Logisim 原码一位乘法器设计 图解及代码(计算机组成原理) 包对

醉蕤的博客 4375

class 033 位运算实现加减乘除

这篇文章是看了“左程云”老师在b站上的讲解之后写的, 自己感觉已经能理解了, 所以就将整个过程写下来了。这个是“左程云”老师个人空间的b站的链接, 数据结构与算法讲的很好很好, 希望大家可以多多支持左程云老师, 真心推荐.

2301_80967814的博客 945

保姆级教程如何进行本地局域网布署openclaw小龙虾

全网唯一一篇一步步实战教程,图文并茂方式的方式教你如何本地部署安装小龙虾openclaw

zzw17wei的专栏 1467

Java如何只使用位运算实现加减乘除

前言 接前面一篇博客,这又是某个公司的奇葩面试题(都说了到底是哪家公司才会出这种没营养的面试题)。不过吐槽归吐槽,这个题目还是有点学问的,比前面那个 不使用比较运算符如何比较两个数的大小 强多了(但是还是能看出面试官是在存心刁难人)。 原题是“只给加法,如何实现减乘除”,我寻思着,既然减乘除都不给了,那就加大点难度,加法也别给了吧,今天就手动去实现加减乘除。这里只实现int类型的加减乘除。 一说到这种“不给xxx如何实现xxx的问题”,那第一个想到的就是位运算,因此本篇博客的各种运算也是基于位运算的。关于位

qq_41530937的博客 383

海康威视工业相机SDK二次开发实战:多相机同步采集与图像存储

本文详细介绍了海康威视工业相机SDK二次开发实战,包括多相机同步采集与图像存储的优化方案。通过MVS软件搭建开发环境,实现硬件与软件触发同步采集,并提供高效的图像存储管理技巧,帮助开发者提升工业视觉项目的效率与稳定性。

weixin_29168813的博客 666

那些年对支付宝的研究[整理]

支付宝功能强大.他内部各个功能间的跳转是通过Uri 实现的.而使用window.location.href 即可.跟浏览器一样的协议.很方便 H5启动支付宝: alipays://platformapi/startapp?appId=20000067&url=网址 alipays://platformapi/startapp?appId=20000691&url=网址 ali...

技术专研 8915

用位运算实现加减乘除法

除法的位运算实现,本质上就是**“按位填充商”**的过程:我们从最高位问到最低位:“嘿,商的这一位填 1 也就是减去y×2iy×2i,原来的数够不够减?够减 -> 填 1,更新被除数。不够 -> 填 0。这其实就是把十进制的长除法变成了二进制版本,效率非常高,稳定在 32 次循环内完成。

jyyyyx的算法之旅 875

基于卷积神经网络的遥感图像地物分类

AI:89-基于卷积神经网络的遥感图像地物分类 基于卷积神经网络的遥感图像地物分类是一个令人兴奋的领域,它在环境监测、城市规划、农业、国防等领域具有广泛的应用。深度学习技术为我们提供了更准确、高效的工具,有望在未来进一步提高分类性能。在本文中,我们探讨了卷积神经网络的工作原理、数据准备、模型构建、训练和评估过程,并提供了多个代码示例。此外,我们讨论了地物分类的应用和挑战,以及未来的发展趋势。

一键难忘的博客 2717

java位运算实现加减乘除

位运算实现加减乘除

如果不能对抗遗忘 那么就记录 1418

基于STM32、HAL库的ZMOD4510AI4R气体传感器驱动程序设计

ZMOD4510AI4R是Renesas公司推出的一款数字空气质量传感器,主要用于检测臭氧(O₃)和总挥发性有机化合物(TVOC)浓度。(status & 0x80)) // 检查数据就绪位。// 等待测量完成 (实际应用中应该使用非阻塞方式)// 转换为ppb (简化转换,实际应根据传感器文档校准)* @param hzmod: ZMOD4510句柄。* @param tvoc: TVOC浓度(ppb)* @param ozone: 臭氧浓度(ppb)* @param hi2c: I2C句柄。

corlin6688的博客 311

YOLOv11改进策略【损失函数篇】| Slide Loss,解决简单样本和困难样本之间的不平衡问题

本文记录的是改进YOLOv11的损失函数,将其替换成Slide Loss,并详细说明了优化原因,注意事项等。Slide Loss函数可以有效地解决样本不平衡问题,为困难样本赋予更高的权重,使模型在训练过程中更加关注困难样本。若是在自己的数据集中发现容易样本的数量非常大,而困难样本相对稀疏,可尝试使用Slide Loss来提高模型在处理复杂样本时的性能。

Limiiiing的博客 4567

计算机基础之位运算、以及位运算实现加减乘除

众所周知,由于电路的复杂性因素,电脑中都使用二进制数,只有0和1两个数码,逢二进一,最容易用电路来表达,比如0代表电路不通,1代表电路通畅。那么,什么是二进制呢? 比如说我们所熟悉的十进制,通俗的说是由0,1,2,3,4,5,6,7,8,9这十个数字组成,如果比9再大一个数,就会进一位,高位加一,低位重置,也就是10。 再比如八进制,是由0,1,2,3,4,5,6,7这八个数组成,逢八进一,比...

鱼阿鱼的博客 1911

cartographer实现纯定位

实现纯定位 (1)因为正常的cartographer的建图的map是由cartographer发布的;如下 rostopic info /map Type: nav_msgs/OccupancyGrid Publishers: * /cartographer_occupancy_grid_node 因此需要把map的发布替换成 <node name="map_server" pkg="map_server" type="map_server" args="/home/lx.

Studying…… 5888

java位运算实现_利用位运算实现加减乘除

利用位运算实现加减乘除基础知识数据在计算机内存中是以二进制存储的。几种常用的位运算:····与运算 &: 对应位均为1时为1,其它为0。····或运算 |:对应位均为0时为0,其它为1。····异或运算 ^:对应位不相同时为1,相同时为0.····按位取反 ~:每一位取反····右移 >>:将二进制进行右移,低位丢掉,高位补零。····左移 <加法int add(int ...

weixin_28861381的博客 343

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Java 实现位运算计算加减乘除

机器数和机器数的真值 一个数在计算机中的二进制表示形式,叫做这个数的机器数。机器数是带符号的,在计算机用机器数的最高位存放符号,正数为0,负数为1。举个例子,比如在机器字长为8位的情况下(机器字长是指计算机直接处理的二进制数据的位数,它决定了计算机的运算精度,一般是8的整数倍,8位、16位、32位、64位、128位),十进制中的+3,转换成二进制就是0000 0011,如果是-3,转换成二进制就是1000 0011。转换的二进制数0000 0011和1000 0011就是机器数。 这里我们还需要知道的就是机

zhuzhoulin的博客 1566

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

位运算---只使用位运算实现整数的加减乘除

【题目】  给定两个32位整数a和b,可正、可负、可0.不能使用算术运算符,分别实现a和b的加减乘除。【要求】  如果给定的a和b执行加减乘除的某些结果本来就会导致数据的溢出,那么你实现的函数不必对那些结果负责。【基本思路】 加法运算  使用位运算实现加法运算主要分为两个部分。先计算完全不考虑进位进行相加的结果,再计算只考虑进位的产生值。将两个结果相加就是最终的结果。  例如:   a:    0

冰殇的博客 2239

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

java用位运算实现加减乘除

我们经常使用的加减乘除,我们所看到的只是表面的效果,那么加减乘除在底层究竟是怎么实现的?今天就让我们一探究竟.今天用位运算实现的加减乘除不使用任何的加减乘除符号.

buhuisuanfa的博客 6340

算法讲解033【必备】位运算实现加减乘除

运算关键位操作等价逻辑加法a ^ b无进位和 + 进位减法加补码(负数)乘法循环左移并累加分解为 2 的幂次和除法右移比较并减去逆向乘法(试减)这些函数展示了如何用位运算模拟算术运算,适合面试或底层编程学习,但实际开发中应直接使用运算符。

chbmvdd的博客 486
上一篇: 二叉树的详解与实现
下一篇: 常用设计模式与六原则详解
陆标
博客等级 码龄9年 100粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值