[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
难道楼主在研究 WOW 刷机练级, 一帖总共才一百多字, 错别字一共 5 个词 10 个字
高阶督军的大头棒ID:18866
物品等级: 78
拾取后绑定
单手         单手锤
146 - 220 伤害        速度 2.90
(+ 63.1357 伤害 / 每秒)
+7 耐力
+14 爆击
+28 攻击强度

闪!
1

评分人数

    • CrLf: 想想也是醉了技术 + 1

TOP

呃, 那个 31?????

假设 8 bits == 1 byte 没有变哈(谁知道会不会变呢),  也假设 CPU 也蛮喜欢 1 就是 1 哈(执行算术右移)
其实我(只是我)也没见过 64 位整数的 cmd,  还是想把这个 31 FIND 出来, 肯定会有更短更好更直接的召唤咒语~~~

命令行敲入
  1. for /l %i in (7 8 127) do set /a "_=1<<%i>>%i+1, IMSB=_&%i|~_&IMSB"
  2. set IMSB
复制代码

TOP

回复 6# CrLf

MSB (Most significant bit)  在大端序中,是最左端的位, 对于有符号整数, 它 是符号位;
把 最右端的 LSB (Least Significant Bit) 编号为第 0 位, MSB 的位编号就是 存储尺寸位数 - 1
对 32 位整数, MSB 的编号就是 32 - 1 = 31

如果并不知道是多少位的整数, 但是知道是 大端序 和 算术右移, 那么下面的式子
T =  1 << n >> (n + 1)        也可以写成这样: 1<<n>>n>>1
仅在 n == 存储尺寸位数 - 1 时, T 的结果才会是 -1, 而 n 取其他任何值时, T 都将得到 0.
可以将 n 的值在一个范围内测试, 当 T 的值得到 -1 时, 就把对应的 n 值保留下来, 这个保留的值就是 MSB 的编号.

TOP

回复 8# CrLf

我猜 XX拼音 可能不懂那个吧
祖国语言就是强
1

评分人数

    • CrLf: 世界语言哪家强?技术 + 1

TOP

本帖最后由 neorobin 于 2014-10-23 14:15 编辑

回复 12# ads350668398

呃, 我可不会什么高深的东东, 只是存储方面的东东, 以及位运算, 学习这些, 你最好找专门的书籍, 诸如贴吧, 网帖教程类的通常都是粗糙且极片面甚至充斥作者的错误理解于其中的.

下面的代码假设所有的变量名你都是知道是什么意思的~~,  并且是以你给出的一个数字一行的文本文件来处理的
  1. @echo off & setlocal enabledelayedexpansion
  2. set /a "_min = 255, _min_cnt = 1 << 31 ^ -1"
  3. for /f %%a in (a.txt) do (
  4.     set /a "x = %%a"
  5.     set /a "_cnt_!x:~0,2! += 1"
  6.     set /a "_sum += x"
  7.     set /a "_cnt_odd += x & 1"
  8.     set /a "_cnt_even += ~x & 1"
  9.     set /a "_cnt_triple += ^!(x %% 3)"
  10.     set /a "t = _max - x >> 31, _max = t & x | ~t & _max"
  11.     set /a "t = x - _min >> 31, _min = t & x | ~t & _min"
  12.     if not defined @%%a (
  13.         for /f "tokens=2 delims=:" %%c in ('find /c "%%a" a.txt') do (
  14.             set /a "x = %%c, # = %%a"
  15.             set /a "t = _max_cnt - x >> 31, _max_cnt = t & x | ~t & _max_cnt, _max_cnt# = t & # | ~t & _max_cnt#"
  16.             set /a "t = x - _min_cnt >> 31, _min_cnt = t & x | ~t & _min_cnt, _min_cnt# = t & # | ~t & _min_cnt#"
  17.         )
  18.         set "@%%a=."
  19.     )
  20. )
  21. set _
  22. pause
复制代码
1

评分人数

    • CrLf: x &amp; 1技术 + 1

TOP

本帖最后由 neorobin 于 2014-10-23 19:17 编辑

回复 16# ads350668398

我不是高手.  你比我注册还早, 只是在线时间很少哈

_min_cnt 统计出现最少的数的出现次数(结果是 143 出现最少, 只有 1 次)
开始要给 _min_cnt 一个初始值, 要足够大(比出现最多的那个数的次数还多就行了, 其实只达到数据量的总数也行了),
999 觉得不够大啊  9999 觉得还不够大哈, 99999?,  9999999, 9999999999999999.......
呃, cmd 下最大的数可没有那么大, 而只有 2147483647 这么大.
这个数我记不住, 所以才写成 1 << 31 ^ -1
1 表示成 32 位(cmd 下只用了 32 位)二进制数
0000 0000 0000 0000 0000 0000 0000 0001
左移 31 位 ( 1 << 31 ) 后
1000 0000 0000 0000 0000 0000 0000 0000
再与 -1 做异或运算   (1 << 31 ^ -1)
异或: 对应位相反, 结果的对应位上得 1, 对应位相同, 结果的对应位上得 0  (简作: 同0异1)
1000 0000 0000 0000 0000 0000 0000 0000
1111 1111 1111 1111 1111 1111 1111 1111   ( -1 就是这样的 )
-------------------------------------------------------------------------------------------
0111 1111 1111 1111 1111 1111 1111 1111   ( 也就是 2147483647 )


_max_cnt=19    出现最多的数出现了多少次
_max_cnt#=161 出现最多的数是哪个

_min_cnt=1        出现最少的数出现了多少次
_min_cnt#=143     出现最少的数是哪个
_sum=31170         就是和, 所有数据加在一起的和
1

评分人数

TOP

返回列表