美文网首页
位运算的作用

位运算的作用

作者: Jiangyouhua | 来源:发表于2021-08-19 12:29 被阅读0次

Hi,大家好,我是姜友华。
学任何一种程序语言时,都会学到位运算,但在程序开发时,我却极少用到,让我觉得这个东西有一点像屠龙术。最近工作,用到了异或加密,因为用得极少,所以记录下。

主要内容:
我所用到的与、或、非、异或、位移。

1. 按位与(&):用于位清零。

如果要将所申请的内存低8位置0,可以将内存的值跟0x100进行按位与运算。这是我在学Metal看到的

/// swift
  let alignedUniformsSize = (MemoryLayout<Uniforms>.size + 0xFF) & -0x100

2. 按位或(|):用于多项选择。

这个用的比较多一点。如系统设置有n个权限,各权限依次定义为2的1-n次方(增1、改2、删4、查8 )。用户权限可以多选,选择时将权限值总计,应用时判断权限用按位或。

//print(1 << 8)
/// swift
// 多个权限。
let insert = 1
let delete = 2
let update = 4
let select = 8

// 赋予权限
let userAuth = insert + select

// 判断权限
if (userAuth | insert) == userAuth {
    print("User has insert operation permission")
}

if (userAuth | delete) == userAuth {
    print("User has delete operation permission")
}

if (userAuth | update) == userAuth {
    print("User has update operation permission")
}

if (userAuth | select) == userAuth {
    print("User has select operation permission")
}

输出的结果是:

User has insert operation permission
User has select operation permission

接位非(~):用于JS的一些判断。

现在应该没人用了,可用在JS某些判断的主要原因有两个:

  1. JS有非空、非0即为真的特征。
  2. 接位非的本质是+1取反。
print(~3 == -(3+1))
print(~2 == -(2+1))
print(~1 == -(1+1))
print(~0 == -(0+1))
print(~(-1) == -(-1+1))
print(~(-2) == -(-2+1))
print(~(-3) == -(-3+1))

结果显示结论是正确的。

true
true
true
true
true
true
true

按上面的结果可见,整数按位非只有-1的值为0。同时使用js的indexOf时,没找到则会返回-1,如是下面应用成立。

/// javascript
let name = "Jiang youhua"

if (name.indexOf("Jiang") > -1) {
  console.log(true)
} else {
  console.log(false)
}

if (name.indexOf("ABC") > -1) {
  console.log(true)
} else {
  console.log(false)
}

if (~name.indexOf("Jiang")) {
  console.log(true)
} else {
  console.log(false)
}

if (~name.indexOf("ABC")) {
  console.log(true)
} else {
  console.log(false)
}

结果为

true
false
true
false

由此可见,这种应用是取巧,判断过程让人费解,所以不建议使用。

异或(^):简单加密

在https不流行的时代,用户登录是以明文的方式传送,这有极高的风险,所以需要加密,异或常用于这里。用异或加密解密极其简单,只需要对每字符进行异或运算即可。

/// swift
extension String{
    // 异或加密。
    func xor(_ key: UInt32) -> String {
        return String(self.unicodeScalars.map { scalar in
            Character(Unicode.Scalar(scalar.value ^ key)!)
        })
    }
    
    // 异或加密。
    func xorEn(_ key: UInt32) -> String {
        let key = UTF8.CodeUnit(key)
        let bytes = utf8.map({ $0 ^ key})
        return String(bytes: bytes, encoding: .utf8) ?? ""
    }
    
    func xorAll(_ key: String) -> String {
        let a: [UInt8] = Array(self.utf8)
        let b: [UInt8] = Array(key.utf8)
        let n = max(a.count, b.count)
        return String(bytes: (0..<n).map { i in
            let x: UInt8 = a.count > i ? a[i] : 0
            let y: UInt8 = b.count > i ? b[i] : 0
            return x ^ y
        }, encoding: .utf8) ?? ""
    }
}

let key: UInt32 = 123
let username = "姜友华".xor(key)
let password = "Jiang youhua".xorEn(key)
let str = "hijklmn"
let code = "abcdefg".xorAll(str)
print(username)
print(password)
print(code)
print(username.xor(key))
print(password.xorEn(key))
print(code.xorAll(str))

输出结果如下:

妧厰匵
1����[������
    �   �   �   
姜友华
Jiang youhua
abcdefg

前3行是加密的,后3行是解密的。

位移(<<,>>)

位移的作用,暂时用过的,只有在代替2的n次方计算时,可节省一点点运算力。

好,就这些吧。我是姜友华,下次见。

相关文章

  • C语言01 -- 运算符

    位运算符 位运算符只作用于整型与字符型的二进制位;位运算都是针对数据的补码进行处理的.位运算符主要分为以下6类: ...

  • C++ 位运算符(bit)

    位运算符(bit) 位运算符作用于位,并逐位执行操作。&、 | 和 ^ 的真值表如下所示: 假设如果 A = 60...

  • Go 语言基础--语法基础

    运算符 同其他语言一样go也有 算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符 这几类,作用也是一致的,...

  • count = ~~count中~~的作用

    ~是按位取反运算,~~是取反两次在这里~~的作用是去掉小数部分因为位运算的操作值要求是整数,其结果也是整数,所以经...

  • Python基础入门:从变量到异常处理(1天)--阿里云天池

    变量、运算符与数据类型和位运算 2 变量、运算符与数据类型 2.1注释 1.在python中,#表示注释,作用于整...

  • 3、小众运算符の大课堂(一)

    较为简单の位运算符: & 位与运算| 位或运算^ 位异或运算~ 位取反运算 举例: 要做位运算,首先要把数据转...

  • 位运算及其应用

    内容概要: 位运算基本操作 基于位运算的状态压缩 位运算经典应用 位运算解N皇后问题 位运算 符号描述规则&与1&...

  • C++_day02

    3 运算符 作用:用于执行代码的运算 3.1 算术运算符 作用:用于处理四则运算 算术运算符包括以下符号: 两个小...

  • 2018-07-11:js中的~波浪符号

    javascript函数前面加~波浪线的作用 1.js中在变量名前加"~" ~ 是位运算NOT,按位取反 var ...

  • 开发基础随笔之位运算符(Bitwise Operators)

    位运算符,属于算术运算符 按位逻辑运算符: 位移运算符: 位运算符的运算数只能是整数 位移运算符:按位左移 a<<...

网友评论

      本文标题:位运算的作用

      本文链接:https://www.haomeiwen.com/subject/tkazbltx.html